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

김건우·2024년 3월 9일
0

문제 풀이

목록 보기
54/62

영단어 암기는 괴로워


풀이 방법

자주풀던 정렬문제, List의 sort 메서드의 Comparator를 오버라이딩해서 내가 원하는대로 정렬해주면 되는 문제였다.

전에 사용했던 Map의 getOrDefault 메서드를 통해 해당 단어가 몇 개 있는지 쉽게 확인할 수 있었다.
(역시 많이 접해볼수록 지식이 늘고있음이 느껴진다)

또 Map의 값들을 받아서 정렬하기위해 List로 변환이 필요했는데, <key,value> 값이 모두 필요했다.
Map.Entry<>를 통해 두 값모두 한번에 받아올 수 있었다.
다른 풀이를 보니, value에 값이 필요할때 다시 Map에서 value 값을 찾는 방식으로 많이 구현했다.
이제 생각해보니 key를 통해 Map에서 value값을 받아오는게 더 효율적일 것 같다..
(다음에 구현할 때는 기존 값을 재사용할 수 있다면 적극적으로 이용하자!)

오랜만에 if문에 따라 오름차순, 내림차순 설정을 해보았는데 if문이 많아지니까 뭔가 답답한 느낌이 들긴한다.
그래도 직관적이게 구현은 한 것 같다.

또한 사전순정렬에서 고민했었는데, 손이 기억하는건지 compareTo메서드를 통해 쉽게 구현했다.

이제 실버문제 정도는 짧은시간안에 풀게 되는것 같다~

코드

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine()," ");

        int n = Integer.parseInt(st.nextToken()); // 단어의 개수
        int m = Integer.parseInt(st.nextToken()); // 외울 단어의 길이

        Map<String, Integer> map = new HashMap<>();
        for(int i=0;i<n;i++) {
            String str = br.readLine();
            if(str.length() < m) continue; // 짧은 단어는 제외
            map.put(str, map.getOrDefault(str,0)+1);
        }

        List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());

        list.sort((o1, o2) -> {
            if(o1.getValue() > o2.getValue()) {
                return o2.getValue()-o1.getValue();
            }
            else if (o1.getValue().equals(o2.getValue()) ) {
                if(o1.getKey().length() > o2.getKey().length()) {
                    return o2.getKey().length()-o1.getKey().length();
                }
                else if (o1.getKey().length() == o2.getKey().length()) {
                    return o1.getKey().compareTo(o2.getKey());
                }
            }
            return 1;
        });

        for(Map.Entry<String, Integer> str : list){
            sb.append(str.getKey()).append("\n");
        }
        System.out.println(sb);
    }
}
profile
공부 정리용

0개의 댓글