Algorithm & Problem Solving/투 포인터(Two Pointer)

[백준 2018] 수들의 합 5 (Python)

baby_ohgu 2020. 12. 26. 18:34

www.acmicpc.net/problem/2018

 

2018번: 수들의 합 5

어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한

www.acmicpc.net

 

문제풀이

N : 입력값

arr : 배열(1부터 N)

start, end : 투 포인터를 위한 포인터

now : 현재까지 더한 값

 

투 포인터(start, end)를 이용하여 해결할 수 있다.

 

1. N을 입력하고 배열(arr)에 1부터 N까지의 값을 넣어준다.

 

2. end와 now를 이용하여 now가 N이상이 될 때 까지 now에 arr[end]를 더하고 end를 1 증가시키는 과정을 반복한다.

 

3. 2의 과정 후 now가 N이면 결과값(ans)를 1 증가시킨다.

 

4. now에서 현재까지 더한 값 중 가장 좌측에 위치한 arr[start]를 빼준다.

 

5. 2~4 과정을 start가 배열의 마지막에 도달할 때 까지 반복한다.

 

6. 결과(ans)를 출력한다.

 

 

코드

if __name__ == '__main__':
    N = int(input())
    arr = [i for i in range(1, N + 1)]

    now, end = 0, 0
    ans = 0
    for start in range(N):
        while end < N and now < N:
            now += arr[end]
            end += 1
        if now == N:
            ans += 1
        now -= arr[start]
    print(ans)

 

결과

 

문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!