2559번: 수열
사용 언어: C++
문제 요약
- 어떤 날마다 측정한 기온이 정수 수열로 주어진다.
- 이 중 연속된 K일 동안의 기온의 합 중에서 가장 큰 값을 구하라.
📌 입력
- 첫 줄: N K
- N: 전체 날짜 수 (2 ≤ N ≤ 100,000)
- K: 연속 날짜 수 (1 ≤ K ≤ N)
 
- 둘째 줄: N개의 정수 (각 날짜의 기온, -100 ~ 100)
📌 출력
- 연속된 K일 동안의 기온 합 중 최댓값
풀이
이 문제를 풀 때 두 가지가 대표적으로 떠오르는데,
1. 첫 번째는 그냥 누적합을 구하고 모든 길이의 구간에 대해서 누적합으로 계산해서 최대값을 비교하는 방법
2. 두 번째는 슬라이딩 윈도우다. 얘는 그냥 개별 인덱스를 사용하는건데 첫번째 구간 인덱스를 더해서 구하고 첫 번째 인덱스는 빼고 다음 인덱스 값을 더해 값을 비교하는 방식이다.
누적합 방식 코드
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int N, M;
    cin >> N >> M;
    vector<int> A(N + 1);
    vector<int> prefix(N + 1);
    cin >> A[0];
    prefix[0] = A[0];
    for (int i = 1; i < N; i++) {
        cin >> A[i];
        prefix[i] = prefix[i - 1] + A[i];
    }
    int maxSum = prefix[M - 1];
    for(int i=M; i<N; i++){
        maxSum = max(maxSum, prefix[i] - prefix[i-M]);
    }
    cout << maxSum << '\n';
    return 0;
}
슬라이딩 윈도우 코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N, M;
    cin >> N >> M;
    vector<int> A(N);
    for (int i = 0; i < N; ++i)
        cin >> A[i];
    int sum = 0;
    for (int i = 0; i < M; ++i)
        sum += A[i];
    int maxSum = sum;
    // 슬라이딩 윈도우: 한 칸씩 이동하며 앞 요소 빼고 새 요소 더하기
    for (int i = M; i < N; ++i) {
        sum += A[i] - A[i - M];
        if (sum > maxSum)
            maxSum = sum;
    }
    cout << maxSum << '\n';
    return 0;
}'BOJ > 누적합' 카테고리의 다른 글
| 25682번: 체스판 다시 칠하기 2 (3) | 2025.08.06 | 
|---|---|
| 10986번: 나머지 합 (3) | 2025.08.05 | 
| 16139번: 인간-컴퓨터 상호작용 (2) | 2025.07.30 | 
| 11659번 : 구간 합 구하기 4 (2) | 2025.07.28 |