Algorithm/문제

33. 매출액의 종류

챛채 2023. 9. 4. 17:16

tow pointer, sliding window 사용

lt 당길 때 map의 key 자체를 삭제하면 안되고 값만 -1해야한다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Map;

public class Main {

    public ArrayList<Integer> solution(int n, int k, int[] arr) {
       ArrayList<Integer> answer = new ArrayList<>();
       HashMap<Integer, Integer> HM = new HashMap<>();
       //k=4이면 3일까지 미리 세팅해두기
        for (int i = 0; i < k - 1; i++) {
            HM.put(arr[i], HM.getOrDefault(arr[i], 0) + 1);
        }
        int lt =0;
        for (int rt = k - 1; rt < n; rt++) {
            HM.put(arr[rt], HM.getOrDefault(arr[rt], 0) + 1);
            answer.add(HM.size());
            HM.put(arr[lt], HM.get(arr[lt]) - 1);
            if (HM.get(arr[lt]) == 0) {

                HM.remove(arr[lt]);
            }
            lt++;
        }
        return answer;
    }
   public static void main(String[] args){
       Main T = new 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();
       }
       for(int x : T.solution(n,k,arr)) System.out.print(x+" ");
   }
}