본문 바로가기
문제 풀이/백준(BOJ)

[Python] 백준 1806번 : 부분합

by 희조당 2022. 8. 10.
728x90

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

 

1806번: 부분합

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

www.acmicpc.net


💡문제 풀이

투 포인터 문제이다.

 

투 포인터의 2가지 유형 중 특정 값을 넘는 배열에 대해서 구하면 된다.

누적 값이 S보다 크다면 개수를 따져주고 왼쪽 포인터를 1 늘린다.

S보다 작다면 오른쪽 포인터를 1 늘린다.

✔️ 느낀 점

쉬운 문제였는데 문제를 제대로 안 읽어서 오래 걸렸다. '이상인 값 모두'

💻 코드

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

start, end = 0, 0
sum_ = arr[0]
ans = 100001

while True:
    if sum_ < S:
        end += 1
        if end == N: break
        sum_ += arr[end]
    else:
        sum_ -= arr[start]
        ans = min(ans, end - start + 1)
        start += 1
        
print(ans if ans != 100001 else 0)

댓글