python, pyTorch/코딩테스트-파이썬

BOJ 1806 부분합

zooyeonii 2022. 3. 1. 19:48

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 = 000
for left in range(N):
    while (prefix_sum[right]-prefix_sum[left])<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