아래 조건에 맞춰 단어의 순서를 정하고 영어 단어장을 만든다.
단! 입력된 M보다 긴 길이의 단어들만 포함한다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Map<String, Integer> wordFrequency = getWordFrequency(br);
List<String> wordList = getWordList(wordFrequency);
for (String word : wordList) {
bw.write(word);
bw.newLine();
}
bw.flush();
bw.close();
br.close();
}
private static Map<String, Integer> getWordFrequency(BufferedReader br) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
Map<String, Integer> wordFrequency = new HashMap<>();
for (int i = 0; i < n; i++) {
String word = br.readLine();
if (word.length() >= m) {
wordFrequency.put(word, wordFrequency.getOrDefault(word, 0) + 1);
}
}
return wordFrequency;
}
private static List<String> getWordList(final Map<String, Integer> wordFrequency) {
List<String> wordList = new ArrayList<>(wordFrequency.keySet());
wordList.sort((w1, w2) -> {
int freqCompare = wordFrequency.get(w2).compareTo(wordFrequency.get(w1));
if (freqCompare != 0) {
return freqCompare;
}
int lengthCompare = Integer.compare(w2.length(), w1.length());
if (lengthCompare != 0) {
return lengthCompare;
}
return w1.compareTo(w2);
});
return wordList;
}
}
처음에 비교해야할 조건이 많아서 복잡할 줄 알았는데 Comparator
를 사용하니 어렵지 않았다.
BufferedWriter
와 System.out.println()
의 성능 차이는 대용량 데이터가 들어올 때 효율적인 것 같다.
해당 문제에서는 여러 문자열들을 다루기 때문에 BufferedWriter
를 사용하면 메모리 효율성을 높일 수 있을 것이라고 판단했다.
잊지 말아야 할 것은 리소스 누수 방지를 위해 꼭 close()
를 해주어야한다는 것이다!!!!