📃 문제 링크
Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.
제한사항
입출력 예
n | result |
---|---|
15 | 4 |
입출력 예 설명
입출력 예#1
문제의 예시와 같습니다.
완전탐색으로 풀었다.
2중 for문을 사용해서 1
~n
의 숫자부터 시작해 연속된 숫자를 sum
에 더해준다. sum
이 n
이 되면 answer
를 하나 올려 주고 두 번째 for문을 나가 다시 다음 숫자부터 시작한다. 이 때, 시간을 줄이기 위해서 sum
이 n
보다 커질 경우 더 이상 연속된 숫자를 더해줄 필요가 없기 때문에 두 번째 for문을 나가도록 구현했다.
def solution(n):
return len([i for i in range(1,n+1,2) if n % i is 0])
코드를 한 줄로 끝내고, 시간도 훨씬 빠른 코드가 있었다.
수학 공식을 구현한 코드이다.
n
이하인 숫자 a
부터 k
개의 연속된 숫자의 합이 n
이라고 가정한다면
a + (a+1) + (a+2) + ... + (a+k-1) = k(2a+k-1)/2 = n
a <= n
k < n
a,k : 자연수
위의 식을 정리하면 a = n/k + (1-k)/2
가 된다.
a
가 자연수라는 조건이 성립하기 위해서는
n/k 가 자연수이려면 : k는 n의 약수여야 한다.
(1-k)/2 가 정수가 되려면 : 1-k 가 짝수여야 하므로 k는 홀수여야 한다.
k < n
위 조건을 만족해야 한다.
따라서 위의 조건을 만족하는 k
의 개수만큼 연속된 자연수의 합이 n
이 될 수 있기 때문에, n
의 약수이면서 홀수인 k
를 찾으면 된다.