Shiny Sky Blue Star

백준 문제 풀이/백준 (JAVA)

JAVA 백준 20920 영단어 암기는 괴로워 (문자열, 정렬, 맵)

gamja00 2025. 5. 11. 17:46

 

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

 


문제

  1. 첫째 줄에 단어의 수 N과 단어의 길이 기준 M ( 1 <= N <= 100000, 1 <= M <= 10 ) 이 입력된다.
  2. 둘째 줄부터 N + 1개의 줄에 외울 단어 ( 1 <= 단어의 길이 <= 10 ) 를 입력 받는다.
    1. 자주 나오는 단어일수록 앞에 배치한다.
    2. 해당 단어의 길이가 길수록 앞에 배치한다.
    3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다.
  3. 3번의 우선순위를 차례로 적응하여 영어 단어장을 만든다.
  4. M보다 짧은 길이의 단어는 단어장에 적지 않아도 된다.

 

 

정답 코드

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

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> count = new HashMap<>();

        for (int i = 0; i < N; i++) {
            String word = br.readLine();

            if (word.length() >= M) {
                count.put(word, count.getOrDefault(word, 0) + 1);
            }
        }

        String[] list = count.keySet().toArray(new String[0]);

        Arrays.sort(list); // 사전 순서
        Arrays.sort(list, Comparator.comparingInt(String::length).reversed()); // 단어 길이
        Arrays.sort(list, (o1, o2) -> { // 단어 횟수
            return count.get(o2) - count.get(o1);
        });

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        for (String s : list) {
            bw.write(s + "\n");
        }
        bw.flush();
        bw.close();
    }
}

 

다른 사람들에 비해 시간이 좀 오래 걸렸다.

 

 

조금 줄어든 코드

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

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> count = new HashMap<>();

        for (int i = 0; i < N; i++) {
            String word = br.readLine();

            if (word.length() >= M) {
                count.put(word, count.getOrDefault(word, 0) + 1);
            }
        }

        String[] list = count.keySet().toArray(new String[0]);

        Arrays.sort(list); // 사전 순서
        Arrays.sort(list, Comparator.comparingInt(String::length).reversed()); // 단어 길이
        Arrays.sort(list, (o1, o2) -> { // 단어 횟수
            return count.get(o2) - count.get(o1);
        });

        StringBuilder sb = new StringBuilder();

        for (String s : list) {
            sb.append(s).append("\n");
        }
        System.out.println(sb);
    }
}

 

BufferedWriter 대신 StringBuilder를 써봤는데 30ms 정도 차이가 났다.

 

원래도 Scanner는 시간 문제 같은 것으로 인해 사용하지 않은 게 제법 오래 됐는데 BufferedWriter를 사용하라는 것처럼 적혀 있어서 사용해보았더니 딱히 좋은 효과는 보지 못한 것 같다.