코테/BOJ

백준 1806 [부분 합] 파이썬

동 캄 2025. 6. 19. 23:43
반응형

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

 

#백준 1806 부분합
import sys

# 입력 받기
N, S = map(int, sys.stdin.readline().split())  # N: 수열의 길이, S: 부분합의 목표값
nums = list(map(int, sys.stdin.readline().split()))  # 수열 입력

is_success = False  # 조건을 만족하는 부분합이 존재하는지 여부
left = 0  # 투 포인터의 왼쪽 끝
right = 0  # 투 포인터의 오른쪽 끝
s = nums[0]  # 현재 부분합
ans = 100001  # 길이의 최댓값 + 1로 초기화 (최솟값을 갱신할 예정)

# 투 포인터로 탐색
while right < N:
    if s >= S:
        # 현재 부분합이 S 이상이면 길이를 정답 후보로 저장하고 왼쪽 포인터 이동
        ans = min(ans, right - left + 1)
        s -= nums[left]
        left += 1
        is_success = True  # 조건을 만족하는 부분합을 찾음
    else:
        # 현재 부분합이 S 미만이면 오른쪽 포인터를 이동하며 합을 늘림
        right += 1
        if right < N:
            s += nums[right]

# 결과 출력
if is_success:
    print(ans)  # 조건을 만족하는 최소 길이 출력
else:
    print(0)  # 조건을 만족하는 부분합이 존재하지 않으면 0 출력

투포인터를 사용하여 해결하였다.

반응형