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);
}
}
'BOJ' 카테고리의 다른 글
[BOJ] [JAVA] 14442번 벽 부수고 이동하기 2 (1) | 2024.01.27 |
---|---|
[BOJ] [JAVA] 1012번 유기농 배추 (0) | 2024.01.20 |
[BOJ] [JAVA] 4779번 칸토어 집합 (1) | 2024.01.14 |
[BOJ] [JAVA] 24060번 알고리즘 수업 - 병합 정렬 1 (0) | 2024.01.14 |
[BOJ] [JAVA] 1016번 제곱 ㄴㄴ 수 (2) | 2024.01.11 |
[BOJ] [JAVA] 11866번 요세푸스 문제0 (0) | 2024.01.10 |
[BOJ] [JAVA] 9012번 괄호 (1) | 2024.01.07 |
[BOJ] [JAVA] 4134번 다음 소수 (0) | 2024.01.07 |