코테/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 출력
투포인터를 사용하여 해결하였다.
반응형