본문 바로가기
자료구조 & 알고리즘

프로그래머스 숫자의 표현 - 자바스크립트 풀이

by PARADISE247 2024. 11. 27.
반응형
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

슬라이딩 윈도우 기법을 활용하여 문제를 풀어보았다.

시작과 끝 포인트를 설정하고 시작부터 끝까지의 값들의 합이 주어진 n과 일치하는지 판단하며 방법의 수를 구하는 방식이다.

우선 전체 코드이다.

function solution(n) {
    if(n === 1) return 1;
    
    let start = 1, end = 1, sum = 1, count = 1;
    
    while(start <= Math.ceil(n / 2)){
        if(sum === n){
            count++;
            sum -= start;
            start++;
        } else if (sum < n){
            end++;
            sum += end;
        } else {
            sum -= start;
            start++;
        }
    }
    return count;
}

 

n이 1인 경우는 답이 1이므로 뒷 과정을 거칠 필요가 없으니 이렇게 1을 반환해주자.

if(n === 1) return 1;

각각 시작 포인트, 끝 포인트, 시작과 끝까지 값들의 합, 방법의 수 변수를 선언하자.

let start = 1, end = 1, sum = 1, count = 1;

n이 만약 15일 경우를 생각해보자. 14 ~ 9까지의 값들은 연속된 숫자합으로 표현하는 것이 불가능하다는 것을 알 수 있다. 8부터 연속된 숫자의 합을 확인하면 된다.

따라서 while문 동작 조건을 start가 Math.ceil(n/2)보다 작거나 같은 경우로 둔다. 

sum이 n보다 작은 경우는 계속해서 end 포인트를 옮겨가며 sum에 end를 더해준다. 

합이 n이 되는 경우, 방법의 수를 1 증가시키고 start를 다음 포인트로 옮겨주어야 한다. 그에 따라 sum 값에서 기존의 start 값은 빼주어야 한다. 

합이 n보다 커지는 경우엔 방법의 수를 증가시키지 않고 start를 다음 포인트로 옮겨주어야 한다. 똑같이 그에 따라 sum 값에서 기존의 start 값은 빼주어야 한다. 코드는 다음과 같다.

while(start <= Math.ceil(n / 2)){
        if(sum === n){
            count++;
            sum -= start;
            start++;
        } else if (sum < n){
            end++;
            sum += end;
        } else {
            sum -= start;
            start++;
        }
}

이 후 count를 반환해주면 끝이다. 

반응형