알고리즘

<백준> 1806번 파이썬 알고리즘 [투 포인터][부분 합]

changha. 2022. 4. 18. 22:49
N, S = map(int, input().split())
li = list(map(int, input().split()))

s = 0
e = 0
summary = 0
prefix_sum = [0]
for i in li:
    summary += i
    prefix_sum.append(summary)

ans = 1000001
s = 0
e = 1

while s != N:
    ## S 이상 일 때 
    if prefix_sum[e] - prefix_sum[s] >= S:
    	## 길이 최소 갱신하기 
        if e - s < ans:
            ans = e - s
        ## 더 작은 값에서도 S 이상이 되는지 알아봐야 함 
        s += 1
    
    else:
    	## (s, e) = (n-1, n) 이 될 때 까지 
        if e != N: 
            e += 1
        else:
            s += 1

if ans != 1000001:
    print(ans)
else:
    print(0)

 


예제)

10 15 

5 1 3 5 10 7 4 9 2 8

prefix_sum = [0, 5, 6, 9, 14, 24, 31, 35, 44, 46, 54]
e - s= 1 - 0 => 5

        2 -  0 => 6

        이런 식으로 가면
        5 -  3 => 24  - 9 = 15 로 

                       2칸이 가장 최소의 길이다