BACK/CodingTEST

[HashMap,treeSet] 매출액의 종류

코딩두통 2023. 1. 18. 23:57
728x90
/** 매출액의 종류 (Hash, sliding window)
 *
 * 현수의 아빠는 제과점을 운영합니다. 현수아빠는 현수에게 N일 동안의 매출기록을 주고 연속된 K일 동안의 매출액의 종류를 각 구간별로 구하라고 했습니다.
 * 만약 N=7이고 7일 간의 매출기록이 아래와 같고, 이때 K=4이면
 * 20 12 20 10 23 17 10
 * 각 연속 4일간의 구간의 매출종류는
 * 첫 번째 구간은 [20, 12, 20, 10]는 매출액의 종류가 20, 12, 10으로 3이다.
 * 두 번째 구간은 [12, 20, 10, 23]는 매출액의 종류가 4이다.
 * 세 번째 구간은 [20, 10, 23, 17]는 매출액의 종류가 4이다.
 * 네 번째 구간은 [10, 23, 17, 10]는 매출액의 종류가 3이다.
 * N일간의 매출기록과 연속구간의 길이 K가 주어지면 첫 번째 구간부터 각 구간별 매출액의 종류를 출력하는 프로그램을 작성하세요.
 *
 * @입력설명: 첫 줄에 N(5<=N<=100,000)과 K(2<=k<=N)가 주어집니다.
 *          두 번째 줄에 N개의 숫자열이 주어집니다. 각 숫자는 500이하의 음이 아닌 정수입니다.
 * @입력예제: 7 4
 *          20 12 20 10 23 17 10
 * @출력예제: 3 4 4 3
 * */

 

해답


public class 매출액의종류 {
    public ArrayList<Integer> solution(int n, int k, int[] arr){
        ArrayList<Integer> answer = new ArrayList<>();
        HashMap<Integer, Integer> HM = new HashMap<>();
        for(int i=0; i<k-1; i++){
            //arr의 키번호를 가져오고 getOrDefault 로 arr[i]번째에 없으면 0을 가져와라
            HM.put(arr[i], HM.getOrDefault(arr[i], 0)+1);
        }
        int lt=0;
        //rt=k-1 k매출액전 까지 넣어줌
        for(int rt=k-1; rt<n; rt++){
            //하나 증가해야함 카운팅 하는거니깐
            HM.put(arr[rt], HM.getOrDefault(arr[rt], 0)+1);
            //키의 종류와 같기때문에
            answer.add(HM.size());
            //rt가 쫒아가야하니
            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) {
    매출액의종류 T = new 매출액의종류();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt(); //총 일수 (7일)
        int k = kb.nextInt();  //k일 동안 (4일)
        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.println(x+ " ");
    }
}

 

728x90