백준 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변수에서 가장 앞의 온도를 빼주고,
그 다음 부분에 해당하는 온도를 더해줘가면 계산을 확 간단하게 줄일 수 있게 된다.
'백준 알고리즘' 카테고리의 다른 글
백준 6603번 로또 문제풀이, 파이썬 (0) | 2023.05.03 |
---|---|
백준 2851번 슈퍼 마리오 문제풀이, 파이썬 (0) | 2023.04.20 |
백준 2167번 2차원 배열의 합 문제풀이, 파이썬 (0) | 2023.04.17 |
백준 1806번 부분합 문제풀이, 파이썬 (1) | 2023.04.16 |
백준 11660번 구간 합 구하기 5 문제풀이, 파이썬 (1) | 2023.04.15 |