Programming/Algorithm

[백준] 1806번 부분합 (by Python)

oranz.23 2021. 3. 26. 02:01

문제

https://www.acmicpc.net/problem/1806

 

1806번: 부분합

첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.

www.acmicpc.net

 

풀이

n, s = map(int, input().split())
arr = list(map(int, input().split()))
ans = n + 1
temp = 0
start = 0
for i in range(n):
    temp += arr[i]
    if temp >= s:
        while temp >= s:
            temp -= arr[start]
            start += 1
        ans = min(ans, i - start + 2)

print(0 if ans > n else ans)

 

    투 포인터 문제이다. S 이상의 값이 될 때까지 시작점에서부터 값을 쭉 더하고, 도달했을 때에는 S 미만의 값이 될 때까지 시작점에서부터의 값을 빼 해당 구간에서 합이 S 이상의 값이 되는 최소 길이를 구하고, 이를 반복하는 방식이다.