이것도 문제 자체는 어렵지 않았지만
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, 크다면 양수를 리턴한다.
잊지말고 다시 한번 머리에 새겨놓기 ~~!!
결과는 당연히 맞았다 !!!