Koala - 10기/코딩테스트 준비 스터디

[백준/Python] #1806 부분합

future0610 2023. 3. 27. 00:07

문제

 

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

 

1806번: 부분합

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

www.acmicpc.net


Algorithm

sum함수를 사용하면 시간이 초과되므로 투포인터 알고리즘으로 처리하되 부분합을 구할 때 누적합에서 누적합을 빼는 방식으로 진행한다. 부분합이 M 이상이 될 때 그 길이의 최솟값을 구한다.

 


 

 

Code

import sys

input = sys.stdin.readline

N, M = map(int, input().split())
array = list(map(int, input().split()))
s = 0
ps = 0

ans = N + 1
i, j = 0, 0
s += array[j]
while j < N:
    if s - ps < M:
        j += 1
        if j < N:
            s += array[j]
    else:
        if i == j:
            ans = 1
            print(ans)
            exit()
        if j - i + 1 <= ans:
            ans = j - i + 1
        ps += array[i]
        i += 1

if ans == N + 1:
    ans = 0
print(ans)