[백준/JAVA] 20920번: 영단어 암기는 괴로워
🔺 문제
20920번: 영단어 암기는 괴로워
첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단
www.acmicpc.net
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import java.util.*;
import java.io.*;
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(), " ");
StringBuilder sb = new StringBuilder();
/*** 입력 받기 ***/
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
Map<String, Integer> map = new HashMap<>();
while(N --> 0) {
String word = br.readLine();
if(word.length() < M) continue;
map.put(word, map.getOrDefault(word, 0) + 1); // <단어, 빈도수> 추가
}
/* 🔔 단어장 정렬하기 🔔 */
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); // <Key, Value> 쌍 유지한 상태로 정렬
list.sort((o1, o2) -> {
// 1. 자주 나오는 단어일수록앞에 배치
int tmp = o2.getValue() - o1.getValue();
if(tmp != 0) return tmp;
else {
// 2. 해당 단어의 길이가 길수록 앞에 배치
int len = o2.getKey().length() - o1.getKey().length();
if(len != 0) return len;
else {
// 3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치
int word = o1.getKey().compareTo(o2.getKey());
return word;
}
}
});
/*** 출력하기 ***/
for(Map.Entry<String, Integer> s : list) {
sb.append(s.getKey()).append("\n");
}
System.out.println(sb);
}
}
|
cs |
✅ 해결 아이디어
✔ 해시 & 정렬
💥 유의사항
• map.entrySet()
⇨ <Key,Value> 쌍 유지한 상태로 정렬
🔺 다른 풀이들
- 개인적으로 이 풀이가 더 이해하기 좋은 것 같다. (정렬 방법이 조금 다름1)
[JAVA] 백준 20920번- 영단어 암기는 괴로워
https://www.acmicpc.net/problem/20920 20920번: 영단어 암기는 괴로워 첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,0
yeoncoding.tistory.com
- 객체 클래스를 만드셔서 비교하도록 하셨다. (정렬 방법이 조금 다름2)
[자바] 백준 20920 - 영단어 암기는 괴로워 (java)
목차 문제 : boj20920 필요 알고리즘 정렬, 해시를 사용한 집합과 맵 해당 단어가 몇 번 나왔는지 알기 위해 HashMap을 쓸 수 있어야 한다(다른 방법들도 있긴하다). 그 외에는 문제에서 제시된 방법대
nahwasa.com
@Override
public int compareTo(final Word o) {
if (this.cnt != o.cnt) {
return o.cnt - this.cnt;
}
if (this.name.length() != o.name.length()) {
return o.name.length() - this.name.length();
}
return this.name.compareTo(o.name);
}
💬 느낀 점
Map 정렬하는 거에 아직 익숙치가 않다..
베스트셀러 문제랑 같이 복습하자...
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ Map.Entry / entrySet() 관련 설명
[Java] HashMap을 정렬하는 방법
Map의 구조처럼 Key, Value의 형태를 정렬을 할 때는 Comparable or Comparator 인터페이스를 구현한 후에 해당 인터페이스에 맞는 compare or compareTo 메소드를 오버라이딩 해서 정렬의 기준을 재정의 한 후에
devlog-wjdrbs96.tistory.com
✔ 풀이 참고
[백준] BOJ20920 - 영단어 암기는 괴로워 (JAVA)
https://www.acmicpc.net/problem/20920 20920번: 영단어 암기는 괴로워 첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,0
tech-heng.tistory.com