빙응의 공부 블로그

[Argorithm]슬라이딩 윈도우 본문

Argorithm 이론

[Argorithm]슬라이딩 윈도우

빙응이 2024. 11. 15. 18:26

📝개요

 

슬라이딩 윈도우 알고리즘에 대해 알아보자

 

📝슬라이딩 윈도우의 핵심 이론

 

일단 배열에서 K개씩 더하는 것 중에서 큰걸 찾는 문제가 있다고 생각해보자..

5 7 -4 14 -3 2 5

 

기본적으로 생각 안하고 풀 수 있는 것은 O(N*K)인 브루트포스를 생각할 것이다.

for(int i = 0; i <= num.length - k; i++){
	int sum = 0;
	for(int j = i; j < i + k; j++)
    		sum += num[j];
	answer = Math.max(answer, sum);
}

 

 

해당 아이디어는 아래와 같은 중복된 연산을 해야하기에 효율성이 떨어진다.

 

슬라이딩 윈도우의 핵심아이디어는
윈도우를 지정해서 이동하면서 계산하는 것이다. 

위 사진처럼 윈도우의 범위 K를 더하고 이동할 때마다 윈도우 범위에서 벗어난 수를 빼주면 된다. 

 

 

📝 추천 문제 12847번: 꿀 아르바이트

문제

윤호는 퍼주기로 유명한 편의점 사장이다. 그의 편의점에는 특이한 임금 체계를 가지고 있다.

  • 각 날마다 일의 차이때문에 일마다 급여가 정해져 있다.
  • 윤호는  오차 없이 일급을 따박 따박 당일에 준다.
  • 정해진 일 수 만큼만 일을 시킨다.
  • 한번이라도 퇴직한 자를 다시 취직 시키지 않는다. (만약 취직을 한다면, 일을 시작 한 날부터 끝날 때까지 하루도 빠지면 안 된다.)

무서운 아르바이트를 짤린 준수는 n+1일 후에 001에 월세를 내야 해서 윤호가 사장으로 있는 편의점에 취직하려 한다. 다행히 주변 퇴직자들의 얘기로 급여에 관련해 파악했다. 또한 퇴직자들의 급여 통계를 통해 당장 n일 후까지 일급 정보를 알아냈다. 하지만 준수는 시험을 준비해야 하기에 최대 m일 밖에 일을 할 수 없다.

어제까지 과제를 제출하고 지금도 001에서 자고 있는 준수를 위해 코딩 잘하는 여러분이 일을 해서 벌 수 있는 최대 이익을 준수에게 또 알려주도록 하자.

입력

월세를 내기 바로 전 날 까지 인 n (1 ≤ n ≤ 100,000) 일과 일을 할 수 있는 날 m (0 ≤ m ≤ n) 일이 주어진다.

그 다음 줄 에는 1일부터 n일 까지 일급 Ti가 순서대로 주어진다. (0 < Ti ≤ 1,000,000)

출력

준수가 일을 해서 벌 수 있는 최대 이익을 출력한다.

예제 입력 1 복사

5 3
10 20 30 20 10

예제 출력 1 복사

70

 

 

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

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        long money[] = new long[n];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            money[i] = Long.parseLong(st.nextToken());
        }

        long answer = 0;
        long sum = 0;
        for (int i = 0; i < n; i++) {
            sum += money[i];
            if (i >= m - 1) {
                answer = Math.max(sum, answer);
                sum -= money[i - m + 1];
            }
        }

        System.out.println(answer);
    }
}

'Argorithm 이론' 카테고리의 다른 글

[Argorithm]다익스트라(Dijkstra)  (0) 2024.08.26
[Argorithm]조합  (0) 2024.08.20
[Argorithm] 0-1 BFS  (0) 2024.07.24
[Arogorithm]그래프 - 플로이드워셜  (0) 2024.07.19
[Argorithm]탐색 알고리즘  (1) 2024.07.14