반응형
문제
문제 설명
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
정렬하고, 같은 단어는 한 번만 출력하는 문제
코드 풀이
1) HashMap
에 단어들을 담는다. (words)
2) LinkedList
에 HashMap의 메소드 중 하나인 entrySet을 사용해 key와 value를 모두 LinkedList로 넣는다. 여기서 entrySet에 의해 중복값이 걸러진다.
- 여기서 LinkedList를 사용하는 이유는 HashMap은 순서가 보장되지 않기 때문에 순서를 유지시키기 위해서이다.
3) Collections.sort에서 Comparator를 사용해 우선순위에 따라 다르게 정렬되도록 한다.
- 여기서 key는 문자열, value는 문자열의 길이이다.
- 따라서 value가 우선순위로 정렬되고, value가 같을 때 사전순으로 정렬되를 되도록 if문을 사용했다.
4) 정렬된 LinkedList의 key 값을 차례대로 출력한다.
성공 코드
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
public class BOJ1181 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
HashMap<String, Integer> words = new HashMap<>();
for (int i = 0; i < n; i++) {
String str = sc.next();
words.put(str, str.length());
}
sc.close();
List<Map.Entry<String, Integer>> answer = new LinkedList<>(words.entrySet());
Collections.sort(answer, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> arg0, Entry<String, Integer> arg1) {
if (arg0.getValue() == arg1.getValue())
return arg0.getKey().compareTo(arg1.getKey());
return arg0.getValue() - arg1.getValue();
}
});
for (int i = 0; i < answer.size(); i++)
System.out.println(answer.get(i).getKey());
}
}
반응형