Algorithm

[99클럽 코테스터디 5일차 TIL] 수열 (슬라이딩 윈도우)

kimphoby 2025. 4. 4. 17:24

 

📌 오늘의 키워드 

  • 누적 합
  • 투 포인터
  • 슬라이딩 윈도우 

📌 문제 파악 

 

 

방법 1.  O(N**2)

일단 그냥 시간 복잡도 고려하지 않고 생각나는건 2중 포문입니다. 

근데 K가 N에 가까워 지는 순간 시간 복잡도는 최악의 경우 O(NK) -> O(N**2)이 된다. 

그러면 당연히~ 1초 넘는다. 

 

방법 2.  O(N)


그러면 어떻게 풀 수 있을까 내가 생각한 방식은 슬라이딩 윈도우다. 인덱스 0번 지점부터 k-1번까지 미리 누적합을 구해둔 후, 윈도우를 한칸씩 밀어나가는거다. 그러면 탐색 과정에서 바로 직전의 인덱스를 제외하고, i + k 번째 값을 추가하면 된다. 

그러면 2중 포문이 아니라 단일 포문으로 가능해지는 것이다. 

 

 

📌 코드 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.PreparedStatement;
import java.util.*;

class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 입력1 : N _ 온도를 측정한 전체 날짜 수, K : 연속적인 날짜의 수
        String readLine = br.readLine();
        String[] NK = readLine.split(" ");
        int n = Integer.parseInt(NK[0]);
        int k = Integer.parseInt(NK[1]);

        // 입력2 : N일 동안 측정한 온도 int 배열
        readLine = br.readLine();
        String[] tempLine = readLine.split(" ");
        int [] temperatures = new int[n+1];

        for(int i=0; i<n; i++) {
            temperatures[i] = Integer.parseInt(tempLine[i]);
        }

        // 로직 :
        // 1. 2중 포문 : 최대 O(N^2) -> 10^10 -> 1초 초과 (불가능)
        // 2. 슬라이딩 윈도우 : 이전 계산 값을 저장하면서 진행. 0(N) -> 10 ^ 5 -> 1초 이내
        int memo = 0;
        int max = 0;

        for (int i=0; i<k; i++){
            memo += temperatures[i];
        }

        max = memo;
        for (int i=1; i<n-k+1; i++){
            memo = memo - temperatures[i-1] + temperatures[i+k-1];
            max = Math.max(max,memo);
        }

        // 출력 : 입력되는 온도의 수열에서 연속적인 K일의 온도의 합이 최대가 되는 값을 출력
        System.out.println(max);
    }
}