
난이도 : 실버 5
유형 : 투포인터
https://www.acmicpc.net/problem/2018
N을 입력 받고,
그 N을 '연속된 자연수의 합' 으로 나타낼 수 있는 경우의 수가 몇가지 있는지 출력하는 문제이다.
15 의 경우
15
7+8
4+5+6
1+2+3+4+5
이렇게 네개가 존재 한다.
start와 end 포인터를 생성하고 start부터 end까지의 합 SUM 변수를 만든다.
SUM과 목표숫자 N의 크기에 따라 start와 end 포인터를 조정해가며 answer의 개수를 늘린다.
import sys
input = sys.stdin.readline
N = int(input()) # 목표 수
start = 1
end = 1
SUM = 1 # 구간 합
answer = 0 # 정답 개수
while (end != N):
if (SUM == N):
answer += 1
end += 1
SUM += end
elif (SUM > N):
SUM -= start
start += 1
else:
end += 1
SUM += end
print(answer)
| start | end | SUM | 설명 |
|---|---|---|---|
| 1 | 1 | 1 | 작다 → end+1, SUM=3 |
| 1 | 2 | 3 | 작다 → end+1, SUM=6 |
| 1 | 3 | 6 | 작다 → end+1, SUM=10 |
| 1 | 4 | 10 | 작다 → end+1, SUM=15 |
| 1 | 5 | 15 | 정답! → answer++, end+1=6, SUM=21 |
| 1 | 6 | 21 | 너무 크다 → start+1=2, SUM=20 |
| 2 | 6 | 20 | 너무 크다 → start+1=3, SUM=18 |
| 3 | 6 | 18 | 너무 크다 → start+1=4, SUM=15 |
| 4 | 6 | 15 | 정답! → answer++, end+1=7, SUM=22 |
| ... 계속 |