자주풀던 정렬문제, 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);
}
}