둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (219) N
    • BOJ (172) N
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (13)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5)
      • 유니온 파인드 (1) N
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

BOJ/누적합

2559번: 수열

2025. 7. 28. 18:19

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
    'BOJ/누적합' 카테고리의 다른 글
    • 25682번: 체스판 다시 칠하기 2
    • 10986번: 나머지 합
    • 16139번: 인간-컴퓨터 상호작용
    • 11659번 : 구간 합 구하기 4
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바