코딩테스트/기타

[Sliding window] 최대 매출 .java

머밍 2024. 10. 25. 20:35

설명

현수의 아빠는 제과점을 운영합니다. 현수 아빠는 현수에게 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

 

 

내 풀이

이중 for문 -> 복잡도가 너무 큼 O(N^2) => n의 최대 100,000임

=> 3일만 보면 되기 때문에 슬라이딩 윈도우로 풀기 -> O(N)

 

1. 인덱스 0~2의 값을 더한 초기 윈도우의 값 구하기

2. 하나의 값씩 윈도우 이동

=> 인덱스 3 값 추가, 인덱스 0 값 빼기 => arr[i] - arr[i-k]

3. 이전의 최댓값과 현재 구한 값 중 최댓값 구하기

 

 


import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int k = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++){
           arr[i] = sc.nextInt();
        }

        int sum  = 0;
        int answer = 0;
        //맨 처음 윈도우 값
        for(int i = 0; i < k; i++) sum += arr[i];

        answer = sum;
        for(int i =k; i < n; i++){
            sum += arr[i] - arr[i-k];

            answer = Math.max(answer, sum);
        }
        System.out.println(answer);


    }
}

 

 

다른 풀이

비슷한  코드지만 함수형이 다름~!


import java.util.Scanner;

public class Main {
    public int solution(int n , int k, int[] arr){
        int answer = 0;
        int sum  = 0;

        //맨 처음 윈도우 값
        for(int i = 0; i < k; i++) sum += arr[i];

        answer = sum;
        for(int i =k; i < n; i++){
            sum += (arr[i] - arr[i-k]);
            
            //최댓값 갱신
            answer = Math.max(answer, sum);
        }

        return answer;

    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int k = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++){
            arr[i] = sc.nextInt();
        }


        System.out.println(T.solution(n,k,arr));


    }
}

💡💡

아직 슬라이딩 윈도우에 익숙하지 않아 하나씩 미는 법을 구현하기 어려워 애를 먹었다

총합의 의미를 다시 생각하니까 단순히 새로운 값 하나 더하고 젤 오래전에 있던 값을 빼면 그게 총합이라는 것을 이용하여 풀었다