본문 바로가기
자료구조&알고리즘/해시를 사용한 집합과 맵

[백준] 해시를 사용한 집합과 맵 - 2910번 빈도 정렬 (Java)

by _din 2022. 6. 29.

문제링크

 

2910번: 빈도 정렬

첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000) 둘째 줄에 메시지 수열이 주어진다.

www.acmicpc.net

 

풀이방법

( 순서를 유지하면서 중복은 허용하지 않으며 값을 갖고있는 자료구조가 필요해 ! )

  • LinkedHashMap을 활용한다. 
  • LinkedHashMap을 정렬하는 메소드도 새로 추가한다.

소스코드 작성방법

  • 숫자를 입력받으면서 이미 맵에 포함되어있으면, 그 값에 1을 더하여 맵의 값을 변경한다.
    그렇지 않으면, 맵에 숫자를 추가한다.

 

  • LinkedHashMap을 정렬하는 메소드를 선언한다.
    • LinkedHashMap을 입력받아 map을 list로 변환한 후 Collections.sort를 활용하여 정렬을 수행한다.
    • 정렬된 후의 맵을 LinkedHashMap 자료구조에 반복문을 탐색하여 put해준다.

 

  • 정렬이 완료된 LinkedHashMap을 배열로 선언하여
    각 키의 값만큼 해당 키를 출력시켜준다.

 

소스코드

package baekjoon.array_map_using_hash;
import java.io.*;
import java.util.*;

public class Q_2910_SortFrequency {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        LinkedHashMap<String, Integer> hashMapList = new LinkedHashMap<>();
        for (int i = 0; i < n; i++) {
            String str = st.nextToken();
            if(hashMapList.containsKey(str)) {
                int count = hashMapList.get(str) + 1;
                hashMapList.put(str, count);
            } else {
                hashMapList.put(str, 1);
            }
        }


        LinkedHashMap<String,Integer> result = sortMapByValue(hashMapList, 1);
        Object[] key = result.keySet().toArray();
        for (int i = 0; i < key.length; i++) {
            int count = result.get(key[i]);
            while(count > 0) {
                bw.write(key[i] + " ");
                count -- ;
            }
        }

        br.close();
        bw.close();
    }
    public static LinkedHashMap<String, Integer> sortMapByValue(Map<String, Integer> map, Integer orderBy) {
        /***
         * Sort Map type data by value
         * @param map - unsorted Map type data [target]
         * @param orderBy - 0: ASC, 1: DESC
         * @return sorted LinkedHashMap type data by value.
         */
        List<Map.Entry<String, Integer>> entries = new LinkedList<>(map.entrySet());
        if(orderBy == 0) {
            Collections.sort(entries, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));
        }
        else {
            Collections.sort(entries, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));
        }

        LinkedHashMap<String, Integer> result = new LinkedHashMap<>();
        for (Map.Entry<String, Integer> entry : entries) {
            result.put(entry.getKey(), entry.getValue());
        }

        return result;
    }

}

 

반응형

댓글