기록하는삶
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 1806번 _ 부분합 본문
728x90
반응형
https://www.acmicpc.net/problem/1806
[문제]
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
반응형
'백준(Python) > 투포인터' 카테고리의 다른 글
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2473번 _ 세 용액 (0) | 2022.03.12 |
---|---|
[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2467번 _ 용액 (0) | 2022.02.14 |