말하는 컴공감자의 텃밭

백준 20920번 영단어 암기는 괴로워 <S3> - HashMap 본문

알고리즘/Backjoon - Java

백준 20920번 영단어 암기는 괴로워 <S3> - HashMap

현콩 2023. 11. 2. 14:39
728x90

 

단어 암기는 싫어 ㅋ
20920번 영단어 암기는 괴로워

 

 

조건을 정리하면 M의 길이보다 작은건 제외, 자주나올수록, 단어가 길 수록 앞으로.

사전순으로 정리하면 된다.

 

단어는 1번만 나오게 해야하니까 Hash 구조를 쓰고, 얼마나 나왔는지 확인도 필요하므로 HashMap구조를 사용했다.

단어를 키로, 나온 수를 값으로 가져줬다.

 

그럼 뭐 쉽죵

 

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
49
50
51
import java.io.*;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws Exception {
 
        // Line으로 받아서 n m 을 토큰으로 받아줌
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
 
        // Input
        // 먼저 M 미만은 무시하고, 리스트에 저장, 정렬 후 빈도수 및 길이 비교로 재정렬
        Map<String, Integer> map = new HashMap<>();
 
        for (int i = 0; i < n; i++) {
            String str = bf.readLine();
            if (!(str.length() < m)) {
                map.put(str, map.getOrDefault(str, 0+ 1);
            }
        }
 
        // 리스트에 단어 넣어두기
        List<String> word = new ArrayList<>(map.keySet());
 
        // 우선 순위에 따라 비교 람다 활용해서 compareTo 구현
        word.sort((o1, o2) -> {
            int c1 = map.get(o1); // 빈도수
            int c2 = map.get(o2); // 빈도수
 
            if (c1 == c2) { // 빈도수가 같은경우
                if (o1.length() == o2.length()) { //단어 길이가 같은경우
                    return o1.compareTo(o2); //알파뱃 순서로
                }
                return o2.length() - o1.length(); //단어가 길수록 앞에 위치
            }
            return c2 - c1; //빈도수가 높은 단어가 앞으로
        });
 
        // 출력
        for(int i = 0; i < word.size(); i++){
            bw.write(word.get(i) + "\n");
        }
 
        bw.flush();
        bw.close();
    }
}
 
cs

 

기존에 편해서 scanner을 쓰고있는데 입력값이 워낙에 커서 버퍼리더로 받아줬다.. 얼른 습관 고쳐야하는데

코테보는 이후로 바로 고쳐 볼 예정이다

728x90
Comments