본문 바로가기

Algorithm/Baekjoon

[백준_JAVA_알고리즘] 20920 영단어 암기는 괴로워 #해시

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        HashMap<String, Integer> hashMap = new HashMap<>();
        int N = Integer.parseInt(stringTokenizer.nextToken());
        int M = Integer.parseInt(stringTokenizer.nextToken());

        for(int i = 0; i < N; i++){
            String line = bufferedReader.readLine();
            if(line.length() >= M)
                hashMap.put(line, hashMap.getOrDefault(line, 0) + 1);
        }

        List<String> list = new ArrayList<>(hashMap.keySet());

        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 자주 등장하는 단어 순서대로 정렬
                if (Integer.compare(hashMap.get(o1), hashMap.get(o2)) != 0) {
                    // 내림차순 정렬
                    return Integer.compare(hashMap.get(o2), hashMap.get(o1));
                }
                // 등장 횟수가 동일한 경우, 문자열의 길이를 비교
                if (o1.length() != o2.length()) {
                    // 긴 문자열이 앞쪽에 위치
                    return o2.length() - o1.length();
                }
                // 등장 횟수와 길이가 같으면 사전 순으로 정렬
                return o1.compareTo(o2);
            }
        });

        StringBuilder stringBuilder = new StringBuilder();
        for (String str : list) {
            stringBuilder.append(str + "\n");
        }

        System.out.println(stringBuilder);
    }
}

 

정렬은 다음과 같이 Comparator을 활용합니다.

Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        if (Integer.compare(hashMap.get(o1), hashMap.get(o2)) != 0) {
            return Integer.compare(hashMap.get(o2), hashMap.get(o1));
        }
        if (o1.length() != o2.length()) {
            return o2.length() - o1.length();
        }
        return o1.compareTo(o2);
    }
});
# 정렬 우선순위
1. 자주 나오는 단어일수록 앞에 배치한다.
2. 해당 단어의 길이가 길수록 앞에 배치한다.
3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다

 

1. 단어 등장 횟수

내림차순 정렬을 위해 o2와 o1를 비교하는 순서로 구현했습니다.

 

2. 단어 길이

o2.length() - o1.length()를 통해 긴 단어가 앞에 오도록 내림차순 정렬합니다.

 

3. 사전순 정렬

String 클래스의 기본 compareTo 메서드를 활용하여 o1.compareTo(o2)를 통해 오름차순 정렬합니다.

 

.

.

.

 

문제는 아래에서 확인할 수 있습니다.

https://www.acmicpc.net/problem/20920