코테/백준

[백준/JAVA] 20920번: 영단어 암기는 괴로워

imname1am 2023. 8. 7. 11:18
반응형

🔺 문제

 

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 != 0return tmp;
            else {
                // 2. 해당 단어의 길이가 길수록 앞에 배치
                int len = o2.getKey().length() - o1.getKey().length();
                if(len != 0return 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

 

반응형