📃 문제 링크
Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.
제한사항
입출력 예
| n | result |
|---|---|
| 15 | 4 |
입출력 예 설명
입출력 예#1
문제의 예시와 같습니다.
완전탐색으로 풀었다.
2중 for문을 사용해서 1~n의 숫자부터 시작해 연속된 숫자를 sum에 더해준다. sum이 n이 되면 answer를 하나 올려 주고 두 번째 for문을 나가 다시 다음 숫자부터 시작한다. 이 때, 시간을 줄이기 위해서 sum이 n보다 커질 경우 더 이상 연속된 숫자를 더해줄 필요가 없기 때문에 두 번째 for문을 나가도록 구현했다.
.png)
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를 찾으면 된다.