기록하는삶

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 1806번 _ 부분합 본문

백준(Python)/투포인터

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 1806번 _ 부분합

mingchin 2022. 2. 26. 15:17
728x90
반응형

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

 

1806번: 부분합

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

www.acmicpc.net

[문제]

10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.

 

[입력]

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

[출력]

첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.

 

[아이디어]

1) 2개의 포인터 i, j를 이용한다.

2) 현 위치 i에 대해 부분합이 S보다 크거나 같을 때까지 j를 오른쪽으로 이동한다.

3) i를 j쪽으로 이동하며 i부터 j까지의 부분합이 S보다 크거나 같으면 그 길이를 업데이트 해나간다.

4) 원래 지정한 충분히 큰 값(10**9)이 유지되었다면 0을 출력하고 그렇지 않으면 저장된 값을 출력한다.

 

import sys
input=sys.stdin.readline

n,s = map(int, input().split())
a = list(map(int, input().split()))

j=0
tmp = 0
ans = int(1e9)
for i in range(n):
    while j<n and tmp < s:
        tmp += a[j]
        j+=1
    if tmp>=s:
        ans = min(ans, j-i)
    tmp -= a[i]
print(0 if ans == int(1e9) else ans)

 

728x90
반응형