문제 설명
문제
어떠한 자연수 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을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 출력하시오
풀이 과정
- 투포인터 알고리즘 사용
- left, right를 두어, 합계를 left~right까지의 합으로 지정
- 현재 합계가 N보다 작다면 right를 늘려 구간을 넓힘
- 현재 합계가 N보다 크거나 같다면 left를 늘려 구간을 좁힘
- 이 때, N보다 클 때는 정답의 개수를 저장해주어야 함.
- 저장해 둔 정답의 개수 출력
소스 코드
import sys
n = int(sys.stdin.readline())
left = 1
right = 1
sumation = 1
answer = 0
while(left <= right):
if sumation == n:
answer += 1
if sumation < n:
right += 1
sumation += right
elif sumation >= n:
sumation -= left
left += 1
print(answer)
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 3078 ] [ Queue ] 좋은 친구 (0) | 2021.08.10 |
---|---|
[ 9934 ] [Tree] 완전 이진 트리 (0) | 2021.08.10 |
[ 10820 ] [String] 문자열 분석 (0) | 2021.08.08 |
[ 4690 ] [완전 탐색] 완전 세제곱 (0) | 2021.08.08 |
[ 1477 ] [ 이분 탐색 ] 휴게소 세우기 (0) | 2021.08.07 |