백준 알고리즘

백준 2559번 수열 문제풀이, 파이썬

고인호 2023. 4. 19. 21:33
반응형

백준 2559번 : 수열 문제풀이 [파이썬] 


<문제>

 

2559번 문제의 내용은 아래와 같습니다. 

 

수열 

문제

매일 아침 9시에 학교에서 측정한 온도가 어떤 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 알아보고자 한다.

예를 들어, 아래와 같이 10일 간의 온도가 주어졌을 때, 

3 -2 -4 -9 0 3 7 13 8 -3

모든 연속적인 이틀간의 온도의 합은 아래와 같다.

 

이때, 온도의 합이 가장 큰 값은 21이다. 

또 다른 예로 위와 같은 온도가 주어졌을 때, 모든 연속적인 5일 간의 온도의 합은 아래와 같으며, 

 

이때, 온도의 합이 가장 큰 값은 31이다.

매일 측정한 온도가 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 계산하는 프로그램을 작성하시오. 

입력

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기 위한 연속적인 날짜의 수이다. K는 1과 N 사이의 정수이다. 둘째 줄에는 매일 측정한 온도를 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -100 이상 100 이하이다. 

출력

첫째 줄에는 입력되는 온도의 수열에서 연속적인 K일의 온도의 합이 최대가 되는 값을 출력한다.

예제 입력 1 복사

10 2
3 -2 -4 -9 0 3 7 13 8 -3

예제 출력 1 복사

21

예제 입력 2 복사

10 5
3 -2 -4 -9 0 3 7 13 8 -3

예제 출력 2 복사

31

 

 

<작성한 코드>

 

#수열
import sys

N, K = map(int, sys.stdin.readline().split())
temp = list(map(int, sys.stdin.readline().split()))
ans = []
ans.append(sum(temp[:K]))

for i in range(N-K):
  ans.append(ans[i]-temp[i]+temp[K+i])

print(max(ans))

 

 

<코드 풀이>

본 문제는 보자마자 너무 쉽다고 생각해서

금방 코드를 작성하고 제출했었다.

처음으로 제출했던 코드는 아래와 같다. 

#수열
import sys

N, K = map(int, sys.stdin.readline().split())
temp = list(map(int, sys.stdin.readline().split()))
ans = []

for i in range(N+1-K):
  ans.append(sum(temp[i:i+K]))

print(max(ans))

 

하지만.... 위의 코드는 시간초과가 떠버렸다. 

아마도 반복문을 돌면서 sum()함수로 계속 불필요한 계산들을 해나가기 때문에 시간초과가 나온 것 같다. 

K의 값이 작으면 상관이 없지만 K의 숫자가 커지면 커질수록 위의 코드는 불필요한 반복 작업이 많아진다. 

 

 

 

#수열
import sys

N, K = map(int, sys.stdin.readline().split())
temp = list(map(int, sys.stdin.readline().split()))
ans = []
ans.append(sum(temp[:K]))

for i in range(N-K):
  ans.append(ans[i]-temp[i]+temp[K+i])

print(max(ans))

따라서 위와 같이 코드를 바꾸어 재작성했다. 

처음 제출했던 코드와 큰 차이점은 계산에 걸리는 불필요한 반복을 확 줄였다는 것이다. 

우선 ans라는 이름의 배열에 가장 처음의 연속적인 K일의 온도를 구해서 할당한다. 

 

이렇게 하게되면, 그 이후에는 구해놓은 K일의 온도를 기준으로 temp변수에서 가장 앞의 온도를 빼주고,

그 다음 부분에 해당하는 온도를 더해줘가면 계산을 확 간단하게 줄일 수 있게 된다. 

반응형