숫자의 표현

Jihoon Han·2022년 1월 2일

문제 설명

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 이하의 자연수 입니다.

입출력 예

nresult
154

풀이

function solution(n) {
    var answer = 0;
    for(let i=1; i<=n; i++) {
        if( n%i == 0 && i%2 ==1 )
            answer++
    }
    return answer;
}

풀이 설명

1️⃣
연속하는 수의 합이 n이 되야 한다.
임의의 자연수 a부터 k번 연속한 자연수의 합
a + (a+1) + (a+2) ... (a+k-1)
식으로 정리하면
k{a+(a+k-1)}/2
얘가 주어진 수 n이 되야 하므로
k(2a+k-1)/2 = n

2️⃣
여기서 a가 임의의 자연수라고 했으므로 a가 자연수가 될 조건만 충족하면
a부터 연속한 수를 k번 더했을 때 자연수 n이 된다
a에 대한 식으로 바꾸면
a = n/k + (1-k)/2가 되고, a가 자연수가 되기 위한 조건으로
1) n/k가 자연수가 되기 위해서 k는 n의 약수여야한다.
2) (1-k)/2가 정수가 되기 위해서(이러면 음수나 0이 나올수도 있을텐데?) k는 홀수여야 한다.
(k는 횟수이므로 무조건 자연수이다)

3️⃣
풀이 속 if문의 i는 덧셈을 시작하는 자연수(a)가 아닌,
연속한 수의 갯수(k)를 의미하고(1 =< k <= n),
num에 나누어 떨어져야하며(num의 약수)(1번 조건),
i%2 == 1(홀수)여야 한다(2번 조건).
k의 조건이 만족하게 되면 임의의 자연수 a로부터 k번 연속하는 수를 더해서 n이 된다.
(a가 어떤 수인지는 구할 필요 없음. 조건에 충족하는 경우의 수만 다 더하면 되기 때문)
하나의 num 안에서 k(횟수)가 중복되는 경우는 없기 때문에
조건을 만족하는 k의 갯수가 결국 답이 된다.

4️⃣
<결론으로 알 수 있는 규칙>
i가 n의 약수이면서 홀수이면 i번만큼 연속하는 수의 합이 n이 될 수 있다.

5️⃣
예외의 발견
65의 약수: 1, 5, 13, 65
13번 연속하는 수: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
자연수가 아닌 음수가 발생하는 경우가 있다.
5 * 13 = 65의 경우, 13의 반보다 5가 작기 때문에 음수가 발생한다.
만약 구해야 하는 값이 방법의 수가 아니라 방법들의 숫자 배열을 구해야 한다면 위 풀이 방법으로는 틀리게 된다.
그럴 땐 13/2 > 5일 경우에 대한 조건을 추가해서 해결해야 할 것 같다.

profile
달려라 코린이!!

0개의 댓글