import sys
N,S = map(int,sys.stdin.readline().rstrip().split())
lis = list(map(int,sys.stdin.readline().rstrip().split()))
# 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이
answer = int(1e9) # 가장 짧은 구간의 길이 (S랑 같거나, 보다 큰 애 찾으면 갱신 체크)
st, en = 0,0 # start pointer, end pointer
#total_sum = 0
# 부분합 초기값 : 리스트의 맨 처음 값으로 해야 함
# 안그러면 list[0:0] 이 목표값보다 작아서 list[0:1] 검사 위해
# end 포인터를 1로 옮기면서 부분합에 옮긴 부분(list[1])의 합을 더해줘야 함
# 이때 부분합에는 맨 처음 값이 있어야 정상적으로 부분합이 더해짐
# 0으로 해놓으면 list[0:1] 값이 아닌 list[1:1] 값이 부분합이 되니깐..
total_sum = lis[0] # 부분합 , S랑 크기 비교해줄 것
while en<N : # 작으면 끝 포인터 증가, 크면 시작 포인터 증가하는게 투포인터의 기본
# print(st, en, total_sum, en-st+1)
if total_sum >= S :
answer = min(answer, en-st+1)
total_sum-=lis[st]
st+=1
else :
en+=1
if en==N: break
# en 이 lis 범위 벗어나나 체크 / lis 뒤에 여분 칸 하나 더 만들어도 좋을 듯
total_sum+=lis[en]
if answer==int(1e9) : print(0)
else : print(answer)
end<N
에 의해 걸러지게 됩니다. 근데 저는 예외처리로 해주었습니다.
import sys
N,S = map(int,sys.stdin.readline().rstrip().split())
lis = list(map(int,sys.stdin.readline().rstrip().split()))
# 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이
answer = int(1e9) # 가장 짧은 구간의 길이
st, en = 0,1 # start pointer, end pointer
while en<N :
# print(st,en,sum(lis[st:en]), answer)
if sum(lis[st:en]) >= S :
answer = min(answer, en-st)
st+=1
else :
en+=1
print(answer)
투포인터 개념을 복습했습니다.
https://www.youtube.com/watch?v=ttLRltNDiCo
제가 구현한 방법말고도 구현 방법이 다양하다고 합니다.
저는 while 문으로 처리했지만 start를 for i in range(N) 만큼 돌면서 풀이하는 방법도 존재합니다.
# n = 데이터의 개수, m = 구하고자 하는 부분 연속 수열의 합
n, m = 10, 6
data = [8, 4, 6, 2, 1, 10, 6, 2, 2, 4]
count = 0
partial_sum = 0
end = 0
for start in range(n):
# end값을 가능한 만큼 증가시킨 다음
while partial_sum < m and end < n:
partial_sum += data[end]
end += 1
# 부분 합이 m이라면 카운트를 증가시킨다.
if partial_sum == m:
count += 1
# start값을 1 증가시키기 전에 해당 수열의 값을 빼준다.
partial_sum -= data[start]
print(count)
import sys
# https://www.acmicpc.net/problem/2003
N,M = map(int,sys.stdin.readline().rstrip().split())
lis = list(map(int,sys.stdin.readline().rstrip().split())) + [0]
start,end = 0,0
total_sum = lis[0]
answer = 0
for i in range(N) : # st pointer
while end<N and total_sum<M:
end+=1
total_sum+=lis[end]
if total_sum==M :
answer+=1
total_sum-=lis[start]
start+=1
print(answer)