[BaekJoon] 백준 1806번 : 부분합

Updated:

1806번 : 부분합


투 포인터를 이용해 부분합을 구할 수 있다.

처음엔 포인터 두 개를 맨 처음과 맨 끝에 두고 좁혀가는 방식으로 계산을 해 풀지 못하고 있었다..

시작과 끝 포인터를 맨 처음에 두고 합이 S 보다 작다면 끝 포인터를 한 칸 옮기고 S 보다 크다면 시작 포인터를 한 칸 옮긴다.

합이 S 보다 클 때는 부분합의 길이를 계산해 갱신 해주면된다.


def solution():
    answer = float('inf')
    start, end, total = 0, 0, 0

    while True:
        if total >= S:
            print(start, end, total)
            answer = min(answer, end - start)
            total -= arr[start]
            start += 1

        elif end == N:
            break

        else:
            total += arr[end]
            end += 1

    if answer == float('inf'):
        return 0
    else:
        return answer


if __name__ == "__main__":
    N, S = map(int, input().split())
    arr = list(map(int, input().split()))

    print(solution())



Categories:

Updated:

Leave a comment