09009

[백준 1806번] 부분합 본문

Algorithm/투 포인터
[백준 1806번] 부분합
09009

문제 보기

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)

 

 

 

참고자료 및  출처

https://velog.io/@leejy1373/%EB%B0%B1%EC%A4%80-%ED%88%AC-%ED%8F%AC%EC%9D%B8%ED%84%B0-1806%EB%B2%88-%EB%B6%80%EB%B6%84%ED%95%A9-Python

'Algorithm > 투 포인터' 카테고리의 다른 글

[백준 2470번] 두 용액  (0) 2023.09.08
[백준 3273번] 두 수의 합  (0) 2023.09.08