문제
주의
- 최소 길이를 저장하는 변수인 minLength를 충분히 큰 값으로 지정한다.
end 포인터?
- end 포인터는 고정시켜 놓는 것이 아니라, 특정 조건까지 이동시키는 것임.
- 해당 문제는 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 것이 목표임.
- 이때, start 포인터와 end 포인터를 사용하여 특정 조건까지 end 포인터를 이동시키면서 부분합을 계산하고, 그 합이 S 이상이 되는 순간 start 포인터를 이동시켜 최소 길이를 구하는 것임.
길이가 0이 될수도 있나?
- for문에서 start를 1씩 증가시키면서 end를 이동시켜 나가다보면 자연스럽게 처리되므로 별도의 처리를 하지 않아도 됨.
코드
"""
1. 아이디어
- for문을 통해서 투 포인터로 문제 접근
2. 시간복잡도
- 투 포인터 O(N) : 1e^5 < 2억개 가능!
3. 자료구조
- 수열 저장 list[]
- 부분합 저장 int
- 길이 저장 int
"""
import sys
input = sys.stdin.readline
N,S = map(int, input().split())
A = list(map(int, input().split()))
sum = 0
minLength = float('inf')
end = 0
def solve():
global sum, minLength, end
for start in range(N):
# 특정 조건까지 end 포인터 이동
while sum < S and end < N:
sum += A[end]
end += 1
# while문을 빠져나와서, 문제의 합과 같은지 확인
if sum >= S:
minLength = min(minLength, end - start)
# 초기화
sum -= A[start]
solve()
if minLength == float('inf'):
print( 0 )
else:
print( minLength )
'Algorithm' 카테고리의 다른 글
[BaekJoon] 백준 1920번 / 수 찾기 / 이진탐색 / Python (0) | 2023.05.03 |
---|---|
[BaekJoon] 백준 알고리즘 2470번 / 두 용액 / 투포인터 / Python (0) | 2023.04.05 |
[BaekJoon] 백준 알고리즘 2003번 / 수들의 합 2 / 투포인터 / Python (0) | 2023.03.30 |
[BaekJoon] 백준 알고리즘 2559번 / 수열 / 투포인터 / Python (0) | 2023.03.28 |
[BaekJoon] 백준 알고리즘 4963번 / 섬의 개수 / DFS / Python (0) | 2023.03.25 |
댓글