https://www.acmicpc.net/problem/1806
10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.
10 15
5 1 3 5 10 7 4 9 2 8
2
# 부분합 '골드4'
n,s = map(int, input().split())
numLi = list(map(int, input().split()))
# 투포인터 설정
start, end, result = 0, 0, 0
answer = 100001
# 범위가 끝날때까지
while True:
# 현재까지의 저장값이 타겟값이상이면
if result >=s:
# 배열의 개수의 최소값 구하고, 위치 및 저장값 재설정
answer = min(answer, end-start)
result -= numLi[start]
start += 1
# 범위를 다 구했을때 break
elif end == n:
break
# 타겟값을 못구했을때 저장값에 계속 더해주기.
else:
result += numLi[end]
end += 1
# 값을 구하지 못했을때
if answer == 100001:
answer = 0
print(answer)
연속된 수, 부분합
이 문제 설명에서 주어졌기에 투포인터
로 풀었습니다!문자열 인덱스
와 min
활용했습니다.