백준 2018번 - 수들의 합5

수들의 합5 문제 바로 가기

baekjoon 알고리즘 문제 풀이
문제:
어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한다. 이때, 사용하는 자연수는 N이하여야 한다. 예를 들어, 15를 나타내는 방법은 15, 7+8, 4+5+6, 1+2+3+4+5의 4가지가 있다. 반면에 10을 나타내는 방법은 10, 1+2+3+4의 2가지가 있다. N을 입력받아 가지수를 출력하는 프로그램을 작성하시오.
입력
첫 줄에 정수 N이 주어진다.
출력
입력된 자연수 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 출력하시오

풀이 코드


n = int(input())
start, end, count, sum = 1,1,0,1

while start <= n:
    if sum == n:
        count+=1

    if sum >= n:
        sum -= start
        start+=1
    else:
        end+=1
        sum += end

print(count)
  

해결 전략:

  • sum < n : 합이 아직 부족하다. 따라서 end를 한 칸 늘리고, 새로운 수를 더한다.
  • sum > n : 합이 너무 크다. 따라서 start를 오른쪽으로 옮겨서, 왼쪽 수를 뺀다.
  • sum == n : 합이 딱 맞다. 따라서 경우의 수(count) + 1을 한다.

코드 동작

단계startendsum행동이유
1111end++합이 작음
2123end++합이 작음
3136end++합이 작음
41410end++합이 작음
51515count++, start++합이 정확히 15
62514end++합이 작음
72620start++합이 큼
83618start++합이 큼
94615count++, start++합이 정확히 15
105611end++합이 작음
115718start++합이 큼
126713end++합이 작음
136821start++합이 큼
147815count++, start++합이 정확히 15
15888end++합이 작음
168917start++합이 큼
17999end++합이 작음
1891019start++합이 큼
19101010종료조건 만족