코딩테스트/문자열
백준 20920번 영단어 암기는 괴로워
9Reflections
2025. 2. 13. 21:33
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
HashMap<String, Integer> wordCount = new HashMap<>();
for(int i = 0; i<n; i++){
String word = br.readLine();
if(word.length() >= m){
wordCount.put(word, wordCount.getOrDefault(word, 0)+1);
}
}
//정렬하기 위해 map.Entry 리스트로 변환
List<Map.Entry<String, Integer>> wordList = new ArrayList<>(wordCount.entrySet());
wordList.sort((a,b) ->{
// 1.자주 나오는 단어 앞에
if(a.getValue() != b.getValue()){
return b.getValue()-a.getValue();
}
// 2. 길이가 긴 단어 앞에
if(a.getKey().length()!= b.getKey().length()){
return b.getKey().length() - a.getKey().length();
}
// 3. 알파벳 사전순 오름차순
return a.getKey().compareTo(b.getKey());
});
// 결과 출력
StringBuilder sb = new StringBuilder();
for(Map.Entry<String, Integer> entry : wordList){
sb.append(entry.getKey()).append("\n");
}
System.out.print(sb);
}
}
- HashMap 을 사용한 이유는 O(1)의 시간 복잡도로 대량의 데이터를 처리할 때 효율적이고 동일한 키를 허용하지 않는다
- HashMap 의 매서드 getOrDefault(Object key, V defaultValue) 는 특정 키의 값을 가져오되 해당 키가 존재하지 않으면 defaultValue 반환
- 빈도수 내림차순(b.getValue() - a.getValue())
- 길이 내림차순(b.getKey().length() - b.getKey().length())
- 알파벳 사전순 오름차순 a.getKey().compareTo(b.getKey())
comparator 동작원리
음수 반환: a 가 b 보다 앞에 와야한다
0 반환: a 와 b 의 순서가 같다
양수 반환: a 가 b보다 뒤에 와야한다