본문 바로가기
BOJ

[BOJ] [JAVA] 20920번 영단어 암기는 괴로워

by Parsler 2024. 1. 14.
 

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

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

www.acmicpc.net

어려워서 못풀고 다른 분의 풀이를 보고 다시 공부했다.

이전에 했던 sort를 Comparator을 사용해서 정렬 규칙을 바꾸는 문제이다.

답을 보고 스윽 다시 적으면 쉽게 이해가 되는데 막상 혼자 풀려고 하면 생각이 잘 안나는 것 같다.

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> map = new HashMap<>();
		
		for (int i = 0; i < n; i++) {
			String s = br.readLine();
			if (s.length() < m) continue;
			
			if (map.containsKey(s)) {
				map.put(s, map.get(s) + 1);
			} else map.put(s, 1);
		}
		
		List<String> list = new ArrayList<>(map.keySet());
		
		list.sort((o1, o2) -> {   // Comparator,,, 람다식으로 구현했다.
			int cnt1 = map.get(o1);
			int cnt2 = map.get(o2);
			
			if (cnt1 == cnt2) {
				if (o1.length() == o2.length()) {
					return o1.compareTo(o2);  // 사전순
				}
				return o2.length() - o1.length(); // 길이순
			}
			return cnt2 - cnt1; // 나온 횟수순
		});
		
		StringBuilder sb = new StringBuilder();
		
		for (String s : list) {
			sb.append(s).append('\n');
		}
		System.out.println(sb);
	}
}