1. BOJ 1806 부분합
골드 4, 누적합, 투포인터
https://www.acmicpc.net/problem/1806
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import sys
input = sys.stdin.readline
N, S = map(int, input().split())
arr = list(map(int, input().split()))
sum_value = 0
prefix_sum = [0]
for i in arr:
sum_value += i
prefix_sum.append(sum_value)
right, interval_sum, ans = 0, 0, 0
for left in range(N):
while (prefix_sum[right]-prefix_sum[left])<S and right<N:
right +=1
if (prefix_sum[right]-prefix_sum[left])>=S:
if ans==0:
ans = (right-left)
else:
ans = min(ans, right-left)
print(ans)
|
cs |
설명
이 문제는 "합이 S 이상"이 되는 것 중 가장 짧은 것을 구하는 것이다.
따라서 대표적인 예시로,
10 10
3 3 3 3 3 3 3 3 3 3
의 출력이 '4' 가 나온다.
누적합 배열 (prefix_sum)을 만들고, 투 포인터를 사용해서 풀 수 있었다. 그냥 투포인터를 사용해서 완탐을 시도했을 때 '시간초과'가 뜨기 때문에, 누적합을 써야한다.
각 구간의 합도 sum(arr[left : right])을 쓰지 않고, prefix_sum[right]-prefix_sum[left]로 계산하였다.
'python, pyTorch > 코딩테스트-파이썬' 카테고리의 다른 글
BOJ 쉬운계단수 (0) | 2022.03.04 |
---|---|
BOJ 1로만들기2, 포도주시식 (0) | 2022.03.04 |
BOJ 2644 촌수계산 (0) | 2022.02.25 |
파이썬 round, sys.stdin.readline() (2) | 2022.02.16 |
BOJ 동전0 (0) | 2022.02.15 |