for문 풀이
n, s = map(int, input().split()) # 숫자 개수 n, 목표 합 s
numbers = list(map(int, input().split())) # 숫자들
tmp_sum = 0 # 임시 숫자들의 합을 저장할 변수
answer = 128349127598217598718296792 # 길이 크게크게 설정 (가장 짧은 것을 구하는 것이므로)
p = 0 # 움직일 포인터 (왼쪽)
for i in range(n): # i == 오른쪽 포인터
tmp_sum += numbers[i] # i번째 숫자 더하기
if s <= tmp_sum: # 숫자들의 합이 목표 합보다 크거나 같다면
for j in range(p, i+1): # 합한 숫자들에서 맨 왼쪽 숫자 빼보면서 길이 줄이기
tmp_sum -= numbers[j] # 가장 왼쪽 숫자 (가장 먼저 더한 숫자 빼기)
if tmp_sum < s: # 목표 합(s)보다 작아졌다면 (목표 합보다 작아질 때까지 빼는거임)
# tmp_l = i - j + 1
# answer = tmp_l if tmp_l < answer else answer
answer = min(i - j + 1, answer) # 길이 짧은걸로 갱신
p = j + 1 # (왼쪽) 포인터는 방금 뺀 숫자의 다음부터 시작
# (방금 뺀 숫자를 포함하면 목표 합이 된다. 방금 뺀 숫자를 포함하지 않으면 목표 합보다 작아지므로 거기서부터 다시 오른쪽 포인터 옮기면서 더해간다)
break # 이미 목표 합보다 숫자가 작아졌으므로 중단
if answer == 128349127598217598718296792: # 목표 합을 구할 수 없는 경우
answer = 0
print(answer)
while문 풀이
n, s = map(int, input().split()) # 숫자 개수 n, 목표 합 s
numbers = list(map(int, input().split())) # 숫자들
inf = float('inf')
answer = inf # 길이 무한대로 설정 (가장 짧은 것을 구하는 것이므로)
tmp_sum = numbers[0] # 임시 숫자들의 합을 저장할 변수
l = r = 0 # 움직일 포인터
while l <= r and r < n: # l이 r 포인터보다 넘어서거나, r포인터가 n을 넘어설때까지 반복
if s <= tmp_sum: # 숫자들의 합이 목표 합보다 크거나 같은 경우
# 길이 갱신
tmp_l = r - l + 1
answer = tmp_l if tmp_l < answer else answer
# 길이 줄이기 (제일 왼쪽 숫자 (가장 처음에 더한 숫자) 빼주기)
tmp_sum -= numbers[l]
l += 1 # 빼줬으니 l포인터 한칸 옮기기
continue
else:
r += 1 # 목표 합에 도달하지 못했을 경우 r포인터 한칸 옮기기
if r == n: break # r포인터가 n이랑 같아졌다면 더이상 더할 숫자 없음! 중단. (인덱스 에러 방지)
tmp_sum += numbers[r] # r포인터가 가르키는 숫자 더해주기
print(answer if answer != inf else 0) # 초기 설정한 숫자(무한대)와 같다면 0 출력 (목표 합 만들지 못한경우) 아니면 구한 길이 출력 !
'Algorithm > Baekjoon' 카테고리의 다른 글
[Python] 9251. LCS (0) | 2021.12.16 |
---|---|
[Python] 12865. 평범한 배낭 (0) | 2021.12.16 |
[Python] 12015. 가장 긴 증가하는 부분 수열2 (0) | 2021.10.21 |
[Python] 2776. 암기왕 (0) | 2021.10.20 |
[Python] 2589. 보물섬 (0) | 2021.10.19 |