1806번: 부분합

첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.

www.acmicpc.net


투포인터 또는 부분합을 이용하자!

 

부분합

import sys
input = sys.stdin.readline


N, S = map(int, input().split())
arr = [0]
arr.extend(list(map(int, input().split())))

for i in range(1, len(arr)):
    arr[i] += arr[i-1]

result = N+1
left = 0
right = 1
while left <=N and right <= N:
    if arr[right]-arr[left] <S:
        right+=1
    else:
        result = min(result, right-left)
        left+=1
    
if result == N+1:
    print(0)
else:
    print(result)
    

 

투포인터

import sys
input = sys.stdin.readline


N, S = map(int, input().split())
arr = list(map(int, input().split()))

result = N+1
_sum = 0
left = 0
right = 0
while True:
    if _sum >= S:
        result = min(result, right-left)
        _sum -= arr[left]
        left += 1
    elif right == N:
        break
    else:
        _sum += arr[right]
        right += 1

if result == N+1:
    print(0)
else:
    print(result)

 

 

'개발 > 알고리즘' 카테고리의 다른 글

[백준 2096] 내려가기 (python)  (0) 2021.04.26
[백준 2143] 두 배열의 합 (python)  (0) 2021.04.26
[백준 1072] 게임 (python)  (0) 2021.04.23
[백준 3055] 탈출 (python)  (0) 2021.04.22
[백준 1103] 게임 (python)  (0) 2021.04.22
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기