[프로그래머스] 숫자의 표현

Narcoker·2022년 12월 2일
0

코딩테스트

목록 보기
65/150

문제 설명

Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.

1 + 2 + 3 + 4 + 5 = 15
4 + 5 + 6 = 15
7 + 8 = 15
15 = 15
자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 return하는 solution를 완성해주세요.

제한사항

n은 10,000 이하의 자연수 입니다.

입출력 예

풀이

n의 절반 값 이상 부터 시작해서 연속된 수를 더하면
무조건 n보다 크기 때문에 시작 수의 최대값은 n의 절반 값으로 한다.

시작 값부터 1씩 증가시켜가며 연속된 수를 더하다가
누적 합 값이 n 이상인 경우 n이랑 같으면 answer 값을 1증가시키고
n 보다 크다면 중단한다.

function solution(n) {
    var answer = 1;
    for(let i = 1; i <= Math.floor(n/2); i++){
        let sum = i;
        for(let k = i+1; k <= Math.floor(n/2)+1; k++){
            sum += k;
            if(sum >= n) {
                if(sum === n) answer++;
                break;
            }
        }
    }
    return answer;
}

다른 사람의 풀이

홀수의 경우, 약수는 홀수 밖에 안나옴.
15의 약수는 1,3,5, 15.
약수를 이용해서 연속된 수의 합이 15가 나오도록 할 수도 있음.
15=1+2+3+4+5 (중간값 3) 3x5 /
15=4+5+6 (중간값 5) 5x3 /
15=7+8 (연속된 수)
7+8 - 홀수인 경우 무조건 가능. /
15=15 /

중간값이 3인 경우,
중간값이 5인 경우,
연속된 수(7, 8),
15(n) 해서 4개인데,
이게 공교롭게 홀수의 약수 수와 같음.
그리고 짝수의 경우는 홀수의 연장선이라고 보면 됨.

n=30인 경우, 30의 약수는 1, 2, 3, 5, 6, 10, 15, 30임.
30=4 + 5 + 6 + 7 + 8 (중간값 3의 연장) 2x3x5 /
30=9 + 10 + 11 (중간값 5의 연장) 2x5x3 /
30=6+7+8+9 (연속된 두 수의 연장) 2x(7+8) /
30=30 /

결과적으로 n의 홀수 약수 개수만 구해도 답이랑 같다.

function expressions(num) {
    var answer = 0;

    for (var i = 1; i <= num; i++) {
        if (num % i == 0 && i % 2 == 1)
            answer++
    }
    return answer;
}

회고

다른 사람의 풀이를 보고 깜짝놀랬다.
저런 수학적 감각은 재능인건가..

profile
열정, 끈기, 집념의 Frontend Developer

0개의 댓글