ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • section4.3
    알고리즘 2025. 8. 7. 22:26
    현수의 아빠는 제과점을 운영합니다. 현수아빠는 현수에게 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이하의 음이 아닌 정수입니다.
    
    출력
    첫 줄에 각 구간의 매출액 종류를 순서대로 출력합니다.
    
    예시 입력 1
    7 4
    20 12 20 10 23 17 10
    
    예시 출력 1
    3 4 4 3

     

     

     

    Answer

    public class Question3 {
        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();
            }
    
            for (String x : solution(n, k, arr)) {
                System.out.print(x + " ");
            }
        }
    
        public static List<String> solution (int n, int k, int[] arr) {
            List<String> answer = new ArrayList<>();
    
            // 필요한 배열 갯수 : n-k+1개
            for (int i = 0; i < n - k + 1; i++) {
                HashSet<Integer> tmpSet = new HashSet<>();
                for (int j = i; j < k+i; j++) {
                    tmpSet.add(arr[j]);
                }
                answer.add(String.valueOf(tmpSet.size()));
            }
    
            return answer;
        }
    }

     

     

     

    SOLUTION

    public class Answer3 {
        public static void main(String[] args) {
            Answer3 T = new Answer3();
            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();
            }
            for (int x : T.solution(n, k, arr)) {
                System.out.print(x + " ");
            }
        }
    
        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++) {
                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;
        }
    }
    • 정답은 맞았지만, 슬라이딩윈도우 알고리즘을 까먹어서 시간 초과, 다시 앞부분 복습하기  
    728x90

    '알고리즘' 카테고리의 다른 글

    section3.2  (0) 2025.08.09
    section3.1  (2) 2025.08.09
    section4.2  (0) 2025.08.07
    section4.1  (2) 2025.08.07
    section4.5  (0) 2025.08.06
Designed by Tistory.