본문 바로가기
알고리즘

[백준/파이썬] #1806

by 룰루루 2025. 3. 28.

풀이를 참고하지 않고 30분 안에 풀었다!

시간제한이 0.5초였어서 O(N^2)가 아닌 O(N)에 풀어야 했고, 그러려면 투 포인터를 사용해야 했다. 

 

left, right 이라는 두 개의 포인터를 사용했고, 현재 배열의 합이 S 이상이 될 때까지 right 포인터를 1씩 증가시켜 배열에 원소를 추가했다. 

그러다가 합이 S이 넘으면 다시 left 포인터를 1씩 증가시켜서, 배열의 원소를 감소시켰다. 합이 S 이상인 배열의 '최소' 길이를 구해야 하기 때문이다. 

import sys

input = sys.stdin.readline

N, S = map(int, input().split())
arr = list(map(int, input().split()))

left, right = 0, 1
current_sum, min_length = arr[left], N+1

while right < N:
    while current_sum < S and right < N:
        current_sum += arr[right]
        right += 1
    if current_sum >= S:
        min_length = min(min_length, right - left)
    while current_sum >= S and left < right:
        current_sum -= arr[left]
        left += 1
    if left > 0 and current_sum + arr[left-1] >= S:
        if current_sum >= S:
            min_length = min(min_length, right - left)
        else:
            min_length = min(min_length, right - left + 1)

min_length = 0 if min_length == N+1 else min_length
print(min_length)

 

'알고리즘' 카테고리의 다른 글

[백준/파이썬] #22945  (0) 2025.03.31
[백준/파이썬] #15961  (0) 2025.03.29
[백준/파이썬] #22862  (0) 2025.03.27
[백준/파이썬&자바] #2470  (0) 2025.03.26
[백준/파이썬] #3151  (0) 2025.03.24