[백준] 1806(파이썬) - 부분합

resilient

·

2021. 8. 5. 14:24

728x90
반응형

https://www.acmicpc.net/problem/1806

 

1806번: 부분합

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

www.acmicpc.net

  • 이 문제는 언뜻 보면 2중 for문으로 탐색하면 되는 거 아니야...?라고 생각할 수 있지만, 메모리와 시간제한을 보면 절대 그럴 수 없다.
  • 이 문제는 투 포인터 문제로, 두개의 변수를 이용해서 인덱스로 활용해서 푸는 문제이다.
  • 투 포인터인 점만 확인하면 비교적 쉽게 풀 수 있는 문제이다.
#시간초과 때문에 2중 for문은 안되고..
import sys
input = sys.stdin.readline

n,s = map(int,input().split())
data = list(map(int,input().split()))

cursor_1 = 0
cursor_2 = 0
ans = 100001
sum_ = 0
while 1:
    if sum_ >= s:
        sum_ -= data[cursor_1]
        cursor_1 += 1
        if cursor_2-cursor_1+1 < ans:
            ans = cursor_2-cursor_1+1 
    else:
        if cursor_2 == n:
            break
        else:
            sum_ += data[cursor_2]
            cursor_2 += 1
if ans < 100001:
    print(ans)
else:
    print(0)   

# for i in range(n):
#     while sum_<s and cursor_2 < n:
#         sum_ += data[cursor_2]
#         cursor_2 += 1
#     if sum_ >= s:
#         if abs(cursor_2-cursor_1)+1 < ans:
#             ans = abs(cursor_2-cursor_1)+1   
#     sum_ -= data[cursor_1]
반응형