알고리즘 스터디

[백준] 1806 부분합 파이썬

문제

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

 

1806번: 부분합

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

www.acmicpc.net

 


풀이

그냥 투포인터로 풀면 되는 문제였다.

st 부터 ed까지의 합이 s 미만이면 ed를 한 칸 뒤로 옮기고

s 이상이면 st를 한 칸 뒤로 옮겨 sum 에서 st에 해당하는 값을 뺐다.

 

불가능할 경우 0을 출력하라는 문구를 못 봐서 틀렸었다.

n, s = map(int, input().split())
arr = list(map(int, input().split()))

st = ed = 0

answer = 100001
sum = arr[0]
while True:
    if st > ed:
        break
    if sum < s:
        ed += 1
        if ed >= n:
            break
        sum += arr[ed]
        
    else:
        answer = min(answer, ed-st+1)
        sum -= arr[st]
        st += 1
        if st >= n:
            break
        
if answer == 100001:
    print(0)
else:
    print(answer)