매일 아침 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
시간초과
연속적인 며칠동안의 온도의 합이 가장 큰지 알아봄
연속된 수열에서 합이 제일 큰것 찾기
반복문 돌면서 1개에서 k개까지 잘라보면서 탐색
k가 가변적이지 않는다.
그냐 반복문 돌면서 k개만큼 자르고,,
10 2 <--- n 온도 측정 전체 날짜수, k 합을 구하기 위한 연속적 날짜 수
3 -2 -4 -9 0 3 7 13 8 -3
#시간초과
n, k = map(int, input().split())
num_list = list(map(int, input().split()))
max_num = 0
for i in range(len(num_list)) :
cut = sum(num_list[i:i+k])
if max_num < cut :
max_num = cut
print(max_num)
누적합 이용 -> 성공
N : 1~10만
K : 1~10만
온도 -100~100
연속 온도의 합잉 "최대" 되는 구간 : 구간합
prefix sum, psum[i] = psum[i-1] + a[i]
처음에 선언해줄때만 sum을 이용하고,
for문을 돌면서 부분합을 맨앞값을 빼주고 맨뒷값을 더해주는(?) 식
n, k = map(int, input().split())
num_list = list(map(int, input().split()))
max_list = []
part_sum = sum(num_list[:k]) #초기 부분 수열 구하기
max_list.append(part_sum) #리스트에 저장하기
for i in range(len(num_list)-k) :
#기존에 만든 부분 수열의 합 - 앞에 숫자[i] + 다음 숫자[i+k]
part_sum = (part_sum - num_list[i]) + num_list[i+k]
max_list.append(part_sum)
print(max(max_list))
'코테풀이 > 누적합' 카테고리의 다른 글
[백준 | 브론즈1] 2차원 배열의 합(누적합, 이차원 누적합, 2차원 누적합, 구간합) (0) | 2022.08.27 |
---|---|
[백준 | 실버3] 구간 합 구하기(누적합, 구간합) (0) | 2022.08.26 |