public int solution(int n) {
int countSum = 0;
int count = 0;
int answer = 0;
while (true) {
countSum = ++count;
if (countSum > n) break;
if ((n - countSum) % count == 0) answer++;
}
return answer;
}
전에 비슷한 문제에 대한 풀이를 본 적이 있어서 기억을 떠올려 풀었다.
연속된 n개의 수는 다음과 같이 나누어 생각해볼 수 있다.
7, 8 = (6 + 1) + (6 + 2) = (6 * 2) + (1 + 2)7, 8, 9 = (6 + 1) + (6 + 2) + (6 + 3) = (6 * 3) + (1 + 2 + 3)7, 8, 9, 10 = (6 + 1) + (6 + 2) + (6 + 3) + (6 + 4) = (6 * 4) + (1 + 2 + 3 + 4)다시 말해 어떤 수가 연속된 n 개의 수의 합이 될 수 있다는 것은
{ (어떤 수) - (1~n 까지의 합) } / n = 0
이 성립한다는 말이다.
countSum 값에 count를 1씩 증가시켜 나가면서 더해준다.
n에서 1~count 까지의 합인 countSum 을 뺐을 때 최소 0 이상이 남아 있어야 n이 count 개의 연속된 수의 합이 될 가능성이 생긴다. 만약 1~count까지의 합이 n 보다 커진다면? n 은 count 개 이상의 연속된 수의 합은 될 수 없다. 따라서 while문 종료.
ex) n = 10인데 count = 5 가 된다면? 10은 5개 이상의 연속된 수의 합은 될 수 없다. 연속된 수를 최소로 잡을 때가 1 + 2 + 3 + 4 + 5 인데 이미 10을 넘어가기 때문.
(n - countSum) % count == 0 일 경우 연속된 count 개의 수의 합으로 표현 가능하다는 의미
answer +1 증가