JS 알고리즘 문제풀이 62

2.뒤집은 소수

📌강의 정리 toString을 해도 되지만 숫자자체를 몫과 나머지로 뒤집어보자. n은 받지말고 arr만 받자. 앤서배열에 답만 푸쉬해서 리턴하자. x of arr를 써보자 포문 안에 result의미에 res변수를 하나 선언한다. while(x)를 하여 원본을 바꿔도 상관없다. 이제 이 안에 let t=x%10; res=res*10+t; x=parseInt(x/10); 을 하면 숫자만으로 자리가 서로 바뀐다. 그리고 isPrime()이라는 함수를 새로 만들어 소수를 구분하는 함수를 만들어야한다. isPrime은 1에서 false를 반환하고 포문을 돌리되 받은수의 절반만큼만 돌리면 된다. 또한 소수를 구하는 포문을 돌릴때 제곱근까지만 돌려도 된다. 그 원리를 생각해 예로들면 16일 경우 4*4이므로 제곱근 ..

1.자리수의 합

📌강의 정리 자리수의 합들을 각각 더해서 최대값을 출력하는 문제이다. 매개변수넘기기는 n을 넘겨도 배열의 길이를 넘겨도 괜찮다. max변수는 가장 작은값이어야 하므로 Number.MIN_SAFE_INTEGER; 로 한다. 우선 숫자 자체가지고 문제를 해결한다면 sum 변수와 tmp변수를 만들어 x값을 넣어준다. 이제 tmp를 %10하고 /10하면 자리수를 더하고 자리수를 숫자에서 삭제하는 코드가 작성된다. 이때 while문을 사용한다. while(tmp)를 하면 된다. /10을 할때는 앞에 Math.floor를 해서 소수점을 없애준다. 이후 if문으로 sum과 max를 비교하여 sum이크면 max에 sum을 대입하여 max에 계속 큰값이 들어오게 하고 answer에는 tmp의 원본값인 x를 넣어준다. i..

5.문자열 압축

📌강의 정리 문자열의 개수가 문자옆에 쓰여져서 압축하는 문제이다. s[i]와 s[i+1]을 비교하는데 cnt는 항상 1개있으니까 cnt=1로 해야한다. 반복을 하면서 달라지면 문자를 넣어주고 cnt를 넣어준다. 그 이후 cnt를 1로 초기화 해준다. 반복하면서 cnt가 1이면 cnt는 넣어주지 않는다. 마지막에서는 비교할게 없으므로 빈 문자를 하나 넣어야 한다. 코드 짤때 주의할 점은 포문의 한계값을 정할때 s.length-1을 해야한다는 점이다. 이제 if로 cnt가 1보다 클때만 cnt를 String(cnt)로 추가해준다. 📌느낀점 나랑 푼방식은 같지만 세세한점이 달랐다. 나는 마지막에서 비교할때 undefined로 사용했지만 강사님은 따로 빈문자를 넣어 좀 더 확실하게 하였고 그래서 반복횟수도 -1..

4.가장 짧은 문자거리

📌강의 정리 문제만 읽고 이해가 안될때는 입력과 출력을 보고 다시 문제를 이해해보자. 매 문자마다 e가 어디있는지 판단하면서 코드를 작성할수는 있지만 그건 힘든일이다. 포문을 정방향으로 한번돌고 역방향으로 돌면 해결할 수 있다. 시간 복잡도는 O(N)이다. 2N처럼 계수는 생략한다. p라는 변수를 1000으로 하고 e를 만나지않으면 ++해준다. e를 만나면 p를 0으로 초기화해준다. 그럼 answer = 1001, 0, 1,2,3,0,1,2,3,4,0이 된다. 이 의미는 자기 왼쪽에 e와 떨어진 거리를 의미한다. 따라서 처음의 p가 1001처럼 큰값을 받은것이다. 그럼 이제 포문을 역방향으로 가면 또 같은방법으로 하면 된다. p가 계속 ++되며 바뀌는 그 방법이다. 이때 answer를 바꿔주는데 최소값을..

3.숫자만 추출

📌강의 정리 문자와 숫자가 섞여서 들어온다. 숫자만 뽑아내어 더하여 parseInt하면 앞의 0은 사라진다. isNaN(x)이면 x가 숫자인지 확인하는 메서드가 있다. str에서 문자를 하나씩 받아서 isNaN을 x로 받아서 숫자인지 문자인지 if문으로 바로 확인한다. 그래서 나온것을 answer에 누적하여 더하고 parseInt하면 끝이다. 만약 parseInt를 쓰지 말라하면 for문과 if에서 answer에 계속 10을 곱하고 Number(x)로 숫자로 계속 더해가면된다. 수학적인 방법이다. 📌느낀점 나는 전에 봤던 메소드들을 응용하여 풀었는데 강사님은 isNaN으로 한번에 풀었다. 메서드를 쓰는 것이 상당히 의미가 잘통한다 잘알아둬야한다. 하지만 면접에서 메서드없이 수학적인걸 원할수도 있기에 수학..

2.유효한 팰린드롬

📌강의 정리 회문문자열은 영어로 팰린드롬이다. 이번에는 알파벳만 비교해야 한다. 내장함수로 풀어보자. 우선 YES NO 로 받으니 앤서를 예스로 해놓고 소문자화한다음에 리플레이스를 해서 알파벳만 놔두고 나머지문자는 다 없앤다. 이 과정은 정규식으로 쉽게 표현할 수 있다. /[^a-z]/g을 하면 된다. 꺽쇠는 부정의 의미이므로 그 이외의 것들을 다 없애라는 뜻이 된다. g는 글로벌영역 전체를 의미한다. 그 다음엔 빈문자를 넣어주면 된다. s=s.toLowerCase().replace(/[^a-z]g, ''); 를 하면 소문자로 문자만 남길 수 있다. 이제 전에 스플릿과 리버스와 조인을 써서 다시 s와 비교하면 손쉽게 풀 수 있다. 이 문제는 리플레이스에서 정규식이용이 중요하다. 📌느낀점 이제는 정규식과 ..

1.회문 문자열

📌강의 정리 회문문자열은 앞으로 읽으나 뒤로 읽으나 같은 문자열을 의미한다. 그러므로 처음에 투어퍼케이스나 로우케이스로 다 바꿔주면 된다. i가0번일때 3번과 비교하고 1번일때 2번과 비교한다. 따라서 이 방법을 쓸때 전체길이의 절반만 쓰면된다. 문자열의 길이가 홀수 일때도 전체길이의 절반만 돌면된다. 먼저 예스 또는 노로 받으므로 앤서에 처음 예스를 준다. 그 이후 로우케이스로 다 소문자로 바꿔주고 길이를 구해준다. 길이변수는 len으로 이름지어준다. 홀수여도 소수라 상관은 없지만 Math.floor를 해주면 더욱 정확히 할 수 있다. 반복문내에서 이프문으로 초기값과 나중값을 비교한다. 나중값은 len-i-1로 해주면된다. 반복문을 돌며 한번이라도 다른값이 나오면 바로 노를 리턴하면된다. 또다른 방법으..

7.봉우리

📌강의 정리 봉우리가 되려면 12,3,6,9시가 다 나보다 낮아야 한다. 여기서 중요한점은 격자의 가장자리는 0으로 나보다 작다고 생각해야한다. 구석에 있다면 바깥쪽은 볼필요가 없다. 4방향 탐색에서 if문을 남발하지말자 1행 2열 인 '1'이 있다. dx와 dy의 배열을 새로 만들어야 한다. dx = [-1, 0, 1, 0] dy = [0, 1, 0, -1] 을 하면 이 배열을 더해주고 빼면서 봉우리를 찾는 코드를 짤 수 있다. 이중 포문을 만들고 거기다 k로 k

6.격자판 최대합

📌강의 정리 행번호와 열번호를 생각한다. arr[행][열] 이다. Number.MIN_SAFE_INTEGER를 하면 최소값을 넣을 수 있다. 이중포문으로 행탐색 열탐색을 할수가 있다. 이제 sum1+=arr[i][j], sum2+=arr[j][i]를 하면 행의 총합, 열의 총합을 구할 수 있다. 처음 포문이 시작될때 섬1,섬2를 0으로 초기화하는 코드를 넣어주고 두번째 포문이 하나 끝날때마다 Math.max(answer, sum1, sum2)를 통해 answer에 최대값을 넣어준다. 그 다음 대각선을 계산하기위해 다시 포문을 이용한다. 이때 포문은 하나만 사용해도된다. arr[i][i]는 오른쪽 아래로 가는 대각선이다. 또한 왼쪽 아래로 대각선은 arr[i][n-i-1]을 하면 구현가능하다. 격자무늬에 ..

5.등수구하기

📌강의 정리 단순히 등수를 측정하는 것에서 이제 중복등수를 계산해야한다. 이중 포문을 돌리는데 먼저 앤서배열에 1로 다 값을 준다. i를 주인공으로 자기보다 큰 점수가 있으면 자기 등수를 ++한다. 처음에 배열에 값을 다 1로 주고 그 앤서배열을 비교하며 카운트하면 중복값을 쉽게 처리할 수 있다. 배열을 다 1로 초기화 하기 위해서 Array.from을 써야한다. Array.from({length:n}, ()⇒1); n은 배열의 길이이고 ()은 콜백함수이다. 이중 포문을 돌리면서 i보다 j가 크면 앤서값을 ++하면 끝이다. 📌느낀점 정말 알고리즘의 세계는 아는 것이 힘이고 머리가 나쁘면 코드가 고생하는게 맞다. 알고나면 쉬운데 왜 그 생각을 못했는지 모르겠다. 이 문제는 풀긴했지만 전혀다른 풀이였는데 강..