백준 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은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 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을 한다.
코드 동작
| 단계 | start | end | sum | 행동 | 이유 |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | end++ | 합이 작음 |
| 2 | 1 | 2 | 3 | end++ | 합이 작음 |
| 3 | 1 | 3 | 6 | end++ | 합이 작음 |
| 4 | 1 | 4 | 10 | end++ | 합이 작음 |
| 5 | 1 | 5 | 15 | count++, start++ | 합이 정확히 15 |
| 6 | 2 | 5 | 14 | end++ | 합이 작음 |
| 7 | 2 | 6 | 20 | start++ | 합이 큼 |
| 8 | 3 | 6 | 18 | start++ | 합이 큼 |
| 9 | 4 | 6 | 15 | count++, start++ | 합이 정확히 15 |
| 10 | 5 | 6 | 11 | end++ | 합이 작음 |
| 11 | 5 | 7 | 18 | start++ | 합이 큼 |
| 12 | 6 | 7 | 13 | end++ | 합이 작음 |
| 13 | 6 | 8 | 21 | start++ | 합이 큼 |
| 14 | 7 | 8 | 15 | count++, start++ | 합이 정확히 15 |
| 15 | 8 | 8 | 8 | end++ | 합이 작음 |
| 16 | 8 | 9 | 17 | start++ | 합이 큼 |
| 17 | 9 | 9 | 9 | end++ | 합이 작음 |
| 18 | 9 | 10 | 19 | start++ | 합이 큼 |
| 19 | 10 | 10 | 10 | 종료 | 조건 만족 |