코딩테스트/문자열

백준 20920번 영단어 암기는 괴로워

9Reflections 2025. 2. 13. 21:33

20920번: 영단어 암기는 괴로워

import java.util.*;
import java.io.*;

public class Main{
    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 m = Integer.parseInt(st.nextToken());
        HashMap<String, Integer> wordCount = new HashMap<>();
      
        for(int i = 0; i<n; i++){
            String word = br.readLine();
            if(word.length() >= m){
                wordCount.put(word, wordCount.getOrDefault(word, 0)+1);
            }            
        }
        
        //정렬하기 위해 map.Entry 리스트로 변환
        List<Map.Entry<String, Integer>> wordList = new ArrayList<>(wordCount.entrySet());
        wordList.sort((a,b) ->{
            // 1.자주 나오는 단어 앞에
            if(a.getValue() != b.getValue()){
                return b.getValue()-a.getValue();              
            }
            // 2. 길이가 긴 단어 앞에
            if(a.getKey().length()!= b.getKey().length()){
                return b.getKey().length() - a.getKey().length();
            }
            // 3. 알파벳 사전순 오름차순
            return a.getKey().compareTo(b.getKey());        
        });
        // 결과 출력
        StringBuilder sb = new StringBuilder();
        for(Map.Entry<String, Integer> entry : wordList){
            sb.append(entry.getKey()).append("\n");
        }
        System.out.print(sb);
    }
}
  • HashMap 을 사용한 이유는 O(1)의 시간 복잡도로 대량의 데이터를 처리할 때 효율적이고 동일한 키를 허용하지 않는다
  • HashMap 의 매서드 getOrDefault(Object key, V defaultValue) 는 특정 키의 값을 가져오되 해당 키가 존재하지 않으면 defaultValue 반환
  • 빈도수 내림차순(b.getValue() - a.getValue())
  • 길이 내림차순(b.getKey().length() - b.getKey().length())
  • 알파벳 사전순 오름차순 a.getKey().compareTo(b.getKey())

comparator 동작원리

음수 반환: a 가 b 보다 앞에 와야한다

0 반환: a 와 b 의 순서가 같다

양수 반환: a 가 b보다 뒤에 와야한다