1806. 부분합

문제

백준 1806번 부분합


풀이

투포인터라는 힌트를 본 덕에 쉽게 풀 수 있었다..

연속된 부분 수열의 왼쪽과 오른쪽을 가리키는 l, r 변수를 사용하여 시간복잡도를 O(n)으로 줄일 수 있었다.

어떤 케이스에서 오답인지 모르겠어서 검색해서 몇 개 대입해본 후 고쳤는데,
테스트케이스를 대입하는 중에도 계속 인덱스 범위를 꼼꼼하게 체크하지 않아서 IndexError: list index out of range가 나왔었다.

n, s = map(int, input().split())
a = list(map(int, input().split()))
res = 1e9
l, r = 0, 0
tot = 0
while r <= len(a) and l <= r:
    if res == 1: break
    if tot >= s:
        if res > r-l: res = r-l
        tot -= a[l]
        l += 1
    else:
        if r == len(a): break
        tot += a[r]
        r += 1
if res != 1e9: print(res)
else: print(0)

부족한 점

항상 인덱스 범위를 꼼꼼하게 체크하자 -> 특히 while문에서 pos등의 인덱스 변수 활용할 때

좋은 웹페이지 즐겨찾기