BAEKJOON (Python)/Prefix Sum Algorithm

BAEKJOON_2559 "수열" PYTHON

RiLLa_0511 2023. 3. 31. 16:44
728x90

[백준] 2559번 Python 파이썬

 

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

 

2559번: 수열

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

www.acmicpc.net

< 시간 초과 코드 >

 

아래의 코드는 O(nk)의 시간 복잡도를 갖기 때문에 n과 k의 크기가 클 경우 오랜 시간이 걸린다. 

import sys

n, k = map(int, sys.stdin.readline().split())
tp = list(map(int, sys.stdin.readline().split()))

lt = [[0] for i in range(n - k + 1)]

for i in range(n - k + 1):
    lt[i] = sum(tp[i:i+k])

print(max(lt))

< 성공한 코드 >

 

아래의 코드는 누적합(Prefix Sum)을 이용하여 입력된 리스트 tp를 한 번만 반복하고,

각 요소마다 상수 시간 연산을 수행하기 때문에시간복잡도 O(n)을 갖는다. 

import sys

n, k = map(int, sys.stdin.readline().split())
tp = list(map(int, sys.stdin.readline().split()))

lt = [0]*(n - k + 1)
lt[0] = sum(tp[:k])

for i in range(1, n - k + 1):
    lt[i] = lt[i-1] - tp[i-1] + tp[i+k-1]

print(max(lt))

혼자 공부하며 올리는 블로그입니다. 틀린 내용은 댓글 남겨주시면 감사하겠습니다.