반응형
문제 설명
입출력 예제
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
풀이 코드
배열에서 특정한 합을 갖는 부분 연속 수열을 찾는 것은 투 포인터 알고리즘을 활용하는 대표적인 예이다.
투포인터 알고리즘에 대한 설명은 아래 링크를 통해 확인 할 수 있다.
[알고리즘] 투 포인터(Two Pointers)란?
투 포인터(Two Pointers) 투 포인터는 말 그대로 두 개의 포인터를 사용하여 문자열, 배열, List에서 원하는 값을 찾는 것 입니다. 투 포인터를 활용하기 위한 조건은 주어진 배열에서 연속된(정렬이
hstory0208.tistory.com
정답 코드
import sys
input = sys.stdin.readline
N, S = map(int, input().strip().split())
nums = list(map(int, input().strip().split()))
total = 0 # 부분합
start = 0
end = 0
min_len = 1e9
while True:
# 현재 부분합이 찾고자하는 값보다 크거나 같다면
if total >= S:
min_len = min(min_len, end - start) # 가장 짧은 길이 갱신
total -= nums[start]
start += 1
# 현재 부분합이 찾고자하는 값보다 작다면
elif total < S:
if end == len(nums): # 배열의 끝까지 탐색했다면 종료
break
total += nums[end]
end += 1
if min_len == 1e9:
print(0)
else:
print(min_len)
'◼ 코딩테스트 > 투포인터 (Two Pointer)' 카테고리의 다른 글
[Python/파이썬] 백준 1644번 - 소수의 연속합 (0) | 2023.07.21 |
---|