최대 매출 (Sliding Window)

문제

설명

현수의 아빠는 제과점을 운영합니다. 현수 아빠는 현수에게 N일 동안의 매출기록을 주고 연속된 K일 동안의 최대 매출액이 얼마인지 구하라고 했습니다.

만약 N=10이고 10일 간의 매출기록이 아래와 같습니다. 이때 K=3이면

12 15 11 20 25 10 20 19 13 15

연속된 3일간의 최대 매출액은 11+20+25=56만원입니다.

여러분이 현수를 도와주세요.

입력

첫 줄에 N(5<=N<=100,000)과 K(2<=K<=N)가 주어집니다.

두 번째 줄에 N개의 숫자열이 주어집니다. 각 숫자는 500이하의 음이 아닌 정수입니다.

출력

첫 줄에 최대 매출액을 출력합니다.

예시 입력 1

10 3
12 15 11 20 25 10 20 19 13 15

예시 출력 1

56

해결방법

  • 슬라이딩 윈도우란 배열에서 특정 크기 만큼의 합을 구할 때 사용하는 개념

    이미지

코드

import java.util.*;

class Main {
    public int solution(int n, int k, int[] arr) {
        int answer, sum = 0;
        // 첫 3일간 매출은 미리 계산하고 시작한다.
        for (int i = 0; i < k; i++) sum += arr[i];
        answer = sum;
        // 4일 부터 마지막 일까지 반복
        for (int i = k; i < n; i++) {
            // 1,2,3일을 계산하고 시작했으며
            // 다음 계산은 2,3,4일 매출액을 합해야 하므로
            // 4일 매출을 더하고, 2일 매출을 빼야한다
            // 이것은 4일 매출에서 2일 매출을 뺀 만큼 기존 합에 더하는 것 과 같다.
            sum += (arr[i] - arr[i - k]);
            answer = Math.max(answer, sum);
        }
        return answer;
    }

    public static void main(String[] args) {
        Main.Main T = new Main.Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int k = kb.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }
        System.out.print(T.solution(n, k, arr));
    }
}


© 2024. Chiptune93 All rights reserved.