본문 바로가기

코딩테스트/백준

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

문제 링크


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

접근 방법


입력된 단어 중 길이가 m 이상인 단어들만 필터링하여 등장 빈도를 카운트합니다.
정렬 기준은 다음과 같습니다:

  1. 자주 나오는 단어일수록 앞에
  2. 길이가 길수록 앞에
  3. 알파벳 사전순으로 앞에

소스 코드


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

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()), m = Integer.parseInt(st.nextToken());

        Map<String, Integer> map = new HashMap<>();
        while (n-- > 0) {
            String str = br.readLine();
            if (str.length() >= m) {
                map.put(str, map.getOrDefault(str, 0) + 1);
            }
        }

        List<String> arr = new ArrayList<>(map.keySet());
        arr.sort((a, b) -> {
            if (map.get(b) - map.get(a) != 0) {
                return map.get(b) - map.get(a);
            } if (b.length() - a.length() != 0) {
                return b.length() - a.length();
            }
            return a.compareTo(b);
        });

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.size(); i++) {
            sb.append(arr.get(i)).append('\n');
        }

        System.out.println(sb);
    }
}

코드 설명


단어 등장 횟수를 HashMap에 저장하고, 조건에 맞는 단어만 List에 담습니다.
List.sort()를 커스텀 comparator로 정렬하여 조건을 만족시킵니다.
StringBuilder로 정답을 한 번에 출력합니다.