본문 바로가기
Algorithm/etc

[파이썬] 백준 2559 : 수열 (실버3)

by 베짱이28호 2023. 5. 24.

[파이썬] 백준 2559 : 수열 (실버3)

 

 

2559번: 수열

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기

www.acmicpc.net


문제


풀이

0. 방향성 생각.

누적된 값을 계속해서 사용한다. 딕셔너리에 현재 날짜까지 합을 구해놓고 구간이 주어지면 두 지점의 누적값을 뺀다.

 

1. 입력, 누적 딕셔너리 만들기.

n,k = map(int,input().split())
temp = list(map(int,input().split()))
table = {}
for i in range(n) :
    if i==0 :
        table[i+1] = temp[i]
    else :
        table[i+1] = table[i]+temp[i]

 

2. 누적 최대값 갱신, 출력

cum_temp = table[k]
for i in range(k+1,n+1):
    if cum_temp < (table[i]-table[i-k]) :
        cum_temp = table[i]-table[i-k]
print(cum_temp)

전체코드

n,k = map(int,input().split())
temp = list(map(int,input().split()))
table = {}
for i in range(n) :
    if i==0 :
        table[i+1] = temp[i]
    else :
        table[i+1] = table[i]+temp[i]

cum_temp = table[k]
for i in range(k+1,n+1):
    if cum_temp < (table[i]-table[i-k]) :
        cum_temp = table[i]-table[i-k]
print(cum_temp)

누적합인걸 모르면 시간초과가 날 수 있는데, DP 처럼 이전에 계산된 값을 이용해서 푼다는 점을 이용해서 리스트, 딕셔너리를 만들어두고 풀면 쉽게 풀 수 있다.

댓글