본문 바로가기

알고리즘

[백준] BOJ20920 - 영단어 암기는 괴로워 (JAVA)

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.util.*;
import java.io.*;

public class Solution
{
    static HashMap<String, Integer> words;
    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        words = new HashMap<>();
        for(int i=0;i<N;i++){
            String tmp = br.readLine();
            //M보다 짧으면 넘기기
            if(tmp.length()<M) continue;
            //hashmap에 있으면 value ++, 없으면 추가
            if(words.containsKey(tmp)){
                words.put(tmp,words.get(tmp)+1);
            }
            else {
                words.put(tmp, 1);
            }
        }

        //오름차순 정렬
        List<Map.Entry<String,Integer>> list = new ArrayList<>(words.entrySet());
        list.sort((o1,o2)->{
            int cmp = o2.getValue()-o1.getValue();
            if(cmp!=0) return cmp;
            else{
                //길이
                int len = o2.getKey().length() - o1.getKey().length();
                if(len!=0) return len;
                else{
                    //사전순
                    int tmp = o1.getKey().compareTo(o2.getKey());
                    return tmp;
                }
            }
        });

        for(Map.Entry<String,Integer> s:list){
            bw.append(s.getKey()).append("\n");
        }
        bw.flush();
        bw.close();

    }
}

 

시간초과로 많이 고생했는데 ,, 결국 bufferedwriter를 사용해서 해결하였다.

System.out.println의 경우 synchronized 블럭으로 감싸져있고 이로 인해 호출만으로도 오버헤드가 발생한다.

public void println(String x) {
     synchronized (this) {
         print(x);   // 출력
         newLine();  // 새로운 줄 생성
     }
}

출력의 양이 많을 때에는 bufferedwriter를 사용하자 !