09009
[백준 1806번] 부분합 본문
문제 보기
https://www.acmicpc.net/problem/1806
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
소스 코드
# sys 모듈에 내장된 maxsize를 사용하면 시스템이
# 지정할 수 있는 최댓값과 최솟값 활용 가능
# - sys.maxsize, sys.maxsize
import sys
n, s = map(int,input().split())
arr = list(map(int,input().split()))
left, right = 0, 0
sum = 0
# 최소 길이를 저장할 변수
min_length = sys.maxsize # 일단 최대 길이로 지정
while True:
# 2) 만약 합이 s를 넘을 경우, left를 하나씩 옮겨준다
if sum >= s:
min_length = min(min_length, right - left)
sum -= arr[left]
left += 1
# 3)
elif right == n:
break
# 1) 총합이 s를 넘지 않을 경우, right을 오른쪽으로 한 칸씩 옮겨준다
# 총합이 s를 넘을 때까지 더한다
else:
sum += arr[right]
right += 1
if min_length == sys.maxsize:
print(0)
else:
print(min_length)
참고자료 및 출처
'Algorithm > 투 포인터' 카테고리의 다른 글
[백준 2470번] 두 용액 (0) | 2023.09.08 |
---|---|
[백준 3273번] 두 수의 합 (0) | 2023.09.08 |
Comments