ALGORITHM

[JAVA] 백준 20920번- 영단어 암기는 괴로워

연듀 2022. 7. 17. 10:20

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

 

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

첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.stream.Collector;
import java.util.stream.Collectors;

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());

        Map<String, Integer> wordMap = new HashMap<String, Integer>();

        for(int i=0; i<n; i++){
            String word=br.readLine();
            if(word.length()<m) continue; // 길이가 m 이하인 단어들 제거

            Integer count = wordMap.getOrDefault(word, 0);
            wordMap.put(word, count+1); // <단어, 빈도수> 추가
        }
        List<String> words = wordMap.keySet().stream().collect(Collectors.toList());

        words.sort((o1, o2) -> {
            int c1=wordMap.get(o1);
            int c2=wordMap.get(o2);

            if(c1==c2){
                if(o1.length() == o2.length()) {
                    return o1.compareTo(o2); // 알파벳 사전 순으로 앞에 있는 단어일수록 앞에
                }
                return o2.length()-o1.length(); // 해당 단어의 길이가 길수록 앞에
            }
            return c2-c1; // 자주 나오는 단어일수록 앞에
        });

        StringBuilder sb=new StringBuilder();
        for(int i=0; i <words.size(); i++){
            sb.append(words.get(i)).append("\n");
        }
        System.out.println(sb);
    }
}