(Java) 백준 2559번 - 수열

코딩너구리·2026년 2월 16일

코딩 문제 풀이

목록 보기
221/266

https://www.acmicpc.net/problem/2559

문제

> 매일 아침 9시에 학교에서 측정한 온도가 어떤 정수의 수열로 주어졌을 때, 
연속적인 며칠 동안의 온도의 합이 가장 큰 값을 알아보고자 한다.

> 예를 들어, 아래와 같이 10일 간의 온도가 주어졌을 때,
3 -2 -4 -9 0 3 7 13 8 -3
모든 연속적인 이틀간의 온도의 합은 아래와 같다.
> 이때, 온도의 합이 가장 큰 값은 21이다.
> 또 다른 예로 위와 같은 온도가 주어졌을 때, 
모든 연속적인 5일 간의 온도의 합은 아래와 같으며,
이때, 온도의 합이 가장 큰 값은 31이다.

> 매일 측정한 온도가 정수의 수열로 주어졌을 때, 
연속적인 며칠 동안의 온도의 합이 가장 큰 값을 계산하는 프로그램을 작성하시오.

접근

누적합으로 풀 수 있다.
주어진 측정된 온도들을 입력을 받으며 누적합의 초기값을 만들기 위해 주어진 K개의 온도를 합해서 저장해 둔다.
이 초기값을 이용해 각각의 K개의 합을 구한다면
sum(i)는 sum(i-1)번째에서 온도(i-1)번째를 빼고, 추가로 num(i-1+K)를 더해주면 된다.

문제해결

> N과 K를 입력받고 측정한 온도 N개를 num배열에 저장하며, 누적합을 저장할 rst배열을 만든다.
> rst배열의 크기는 K의 값에 따라서 N-K+1개의 결과를 가지게 된다.
> 1-based로 인덱싱하기 위해 0번째를 주고 N개의 온도를 입력받으며 rst의 초기값인 1번을 미리 누적한다.
> 만든 rst(1)을 이용해 rst(2)번부터 주어진 k를 고려해 누적합을 구한다.
> 누적합을 구하며 rst(1)을 기준으로 최대값연산으로 최대의 값을 구한다.

코드

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main {
    //2559번 수열
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        
        st = new StringTokenizer(br.readLine());
        int[] num = new int[N+1];
        int[] rst = new int[N-K+2];
        
        num[0] = rst[0] = 0;
        for(int i = 1; i <= N; i++) {
            num[i] = Integer.parseInt(st.nextToken());
            if(i <= K) rst[1] += num[i];
        }
        
        int Max = rst[1];
        for(int i = 2; i <= N-K+1; i++){
            rst[i] = rst[i-1] - num[i-1] + num[i-1+K];
            Max=  Math.max(Max, rst[i]);
        }
        System.out.print(Max);
    }
}


후기

누적합의 규칙을 인덱싱 하는게 좀 생각할 수 있는 시간을 요헀다.

0개의 댓글