문제

풀이

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개의 수는 다음과 같이 나누어 생각해볼 수 있다.

다시 말해 어떤 수가 연속된 n 개의 수의 합이 될 수 있다는 것은

{ (어떤 수) - (1~n 까지의 합) } / n = 0

이 성립한다는 말이다.

풀이

  1. 변수 선언
    1. count : 연속된 수의 개수를 나타내는 변수
    2. countSum = 1 ~ count 까지를 더한 합
    3. answer : 주어진 n이 연속된 수의 합으로 나타내어지는 개수
  2. countSum 이 n 보다 커질 때까지 while 문을 반복한다.
    1. countSum 값에 count를 1씩 증가시켜 나가면서 더해준다.

    2. 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을 넘어가기 때문.

    3. (n - countSum) % count == 0 일 경우 연속된 count 개의 수의 합으로 표현 가능하다는 의미

      answer +1 증가