PS_Baekjoon
[백준 C++] 2559번 : 수열
SMILELY
2023. 3. 6. 23:54
https://www.acmicpc.net/problem/2559
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
풀이 :
- n길이의 수열에서 k구간의 합 중 최대값을 구하는 문제이다
- 구간의 합을 구하는 문제는 누적합을 이용하면 쉽게 구할 수 있다
- 첫번째 예제를 생각해보자
이렇게 누적합이 구해진다.
1~2 구간 : sum[2] - sum[0]
2~3 구간 : sum[3] - sum[1]
다른 구간도 마찬가지이다.
따라서 i = k일 때, sum[i] - sum[i-k]로 구할 수 있다.
하지만, 제일 처음 구간 즉, 0~1구간을 같은 공식으로 구하면 i가 1일때 -1을 참조하게 된다.
그것을 막기 위해 ans의 초기화는 sum[k-1]로 해주고 i는 k부터 시작하게 해줬다.
k-1인 이유는 0부터 시작하기 때문
코드 :
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int n, k, arr[100005], sum[100005], ans;
cin >> n >> k;
for(int i=0; i<n; i++){ // 입력과 동시에 누적합을 구해서 배열에 넣어줄 것
cin >> arr[i];
if(i == 0){ // 누적합의 0번째 배열에는 0번째 인덱스에 들어있는 값 그 자체이고,
sum[i] = arr[i]; // sum[-1] 방지를 위해 따로 처리
}else{
sum[i] = sum[i-1] + arr[i]; // 인덱스가 0이 아닐 경우 누적합 배열 직전 인덱스와 들어온 값을 더해 누적합을 구한다
}
}
ans = sum[k-1];
for(int i=k; i<n; i++){
ans = max(ans, sum[i]-sum[i-k]); // ans에 들어있는 값과 비교하여 최대값 갱신
}
cout << ans << '\n';
}