[백준]1181 단어 정렬

서은경·2023년 1월 27일
0

CodingTest

목록 보기
55/71

이것도 문제 자체는 어렵지 않았지만
map의 정렬같은 경우 꽤 자주 나왔던 걸로 기억하기도 하고
한번 정리해두고 완벽히 이해하면 좋을 것 같아서
포스팅 !

package baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main_1181 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            map.put(s, s.length());
        }

        List<Map.Entry<String, Integer>> entryList = new ArrayList<>(map.entrySet());
        entryList.sort(new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                //System.out.println(o1.getKey() + " " + o1.getValue() + " / " + o2.getKey() + " " + o2.getValue());
                if(o1.getValue() == o2.getValue()) {
                    return o1.getKey().compareTo(o2.getKey());
                } else {
                    return o1.getValue() - o2.getValue();
                }
            }
        });
        for (Map.Entry<String, Integer> entry : entryList) {
            System.out.println(entry.getKey());
        }


    }
}

중복되는 단어는 한번만 출력되면 되기 때문에 map에 키값으로 입력받은 단어, 밸류값으론 그 단어의 길이를 넣었다.
1. 길이가 짧은순 2. 사전순 이므로 일단 값비교후 값이 같으면 키비교를 하도록 compare 함수를 오버라이딩 해주었다.

Map.Entry를 리스트로 받아온다.
(Map.Entry ⁉️ map의 내부 인터페이스로 map에 저장된 Key-Value 쌍을 다루기 위해 내부적으로 entry 인터페이스를 정의해놓은 것이다.)

comparator() 인터페이스를 재정의하여 사용한다. 비교할 엔트리 value들(=글자수)가 같으면 사전순으로 출력되어야 하므로 compareTo 메서드를 이용해 단어를 비교하고 그게 아니면 value의 길이순으로 출력되도록 한다.

리턴값으로 어떻게 정렬이 되는지 궁금해서 구글링을 좀 해보았는데 리턴된 값이 양수,음수,0인지에 따라 객체의 위치가 정해진다. 첫번째 인자가 두번째 인자보다 작다면 음수, 같다면 0, 크다면 양수를 리턴한다.

잊지말고 다시 한번 머리에 새겨놓기 ~~!!
결과는 당연히 맞았다 !!!

0개의 댓글

관련 채용 정보