백준 2910번 빈도 정렬

이상민·2023년 9월 8일
0

알고리즘

목록 보기
48/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Frequency_Sort {
    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 C = Integer.parseInt(st.nextToken());
        HashMap<Integer,Integer> map = new LinkedHashMap<>();
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            int arr = Integer.parseInt(st.nextToken());
            map.put(arr,map.getOrDefault(arr,0)+1);
        }
        ArrayList<Integer> keylist = new ArrayList<>(map.keySet());
        Collections.sort(keylist, new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {
                return Integer.compare(map.get(b), map.get(a));
            }
        });
        for (int i = 0; i < keylist.size(); i++) {
            for (int j = 0; j < map.get(keylist.get(i)); j++) {
                System.out.print(keylist.get(i)+" ");
            }
        }


    }
}

풀이방법

📢이 문제의 요구사항은 1. 빈도수기준 내림차순 2. 빈도수 같을때, 먼저온 순서대로 정렬이다.
1번 요구사항을 인덱스, 빈도수를 키,값으로 하여 내림차순 정렬하고
2번 요구사항을 개별처리 하는 것으로 설계하는 것이 핵심이다.

  1. 해시맵, getOrDefault 메서드를 사용하여 인덱스별 빈도수를 저장한다.
  2. 키를 keylist에 담고, 빈도수를 기준으로 내림차순 정렬한다.
  3. 빈도수 같을때 처리를 if문을 통해서 따로 할 수도 있고, LinkedHashMap을 사용하면 먼저온 순서대로 저장되므로, 따로 처리안해줘도 된다.
  4. 각 인덱스에 해당하는 키를 빈도수 만큼 반복해서 출력한다.

후기

컬렉션 내림차순은 항상 볼때마다 막혔었는데 이번계기로 완벽하게 숙지할 수 있도록 해야겠다.

profile
개린이

0개의 댓글