[BOJ] 20920 - 영단어 암기는 괴로워 (🥈 실버 3티어)
사용 언어: Java
문제
풀이
나의 풀이
자바
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
String str[] = in.readLine().split(" ");
int numbers[] = new int[str.length]; // array 초기화
for (int i=0; i<str.length; i++) {
numbers[i] = Integer.parseInt(str[i]);
}
// <단어, 빈도수> 입력받기
Map<String, Integer> wordMap = new HashMap<String, Integer>();
for (int i=0; i<numbers[0]; i++) {
String word = in.readLine();
if (word.length() >= numbers[1]) {
Integer cnt = wordMap.getOrDefault(word, 0);
wordMap.put(word, cnt+1);
}
}
// 우선순위 역순으로 words를 정렬하면 된다!
List<String> words = wordMap.keySet().stream().collect(Collectors.toList());
words.sort((w1, w2) -> {
int w1Cnt = wordMap.get(w1);
int w2Cnt = wordMap.get(w2);
if (w1Cnt == w2Cnt) {
if (w1.length() == w2.length()){
return w1.compareTo(w2); // 3. 알파벳 사전 순으로 앞에 있는 단어일수록
}
return w2.length() - w1.length(); // 2. 해당 단어의 길이가 길수록 앞에
}
return w2Cnt - w1Cnt; // 1. 자주 나오는 단어일수록 앞에
});
for (String word: words) {
out.write(word + "\n");
}
out.close();
in.close();
}
}
- 테스트 케이스: 성공
- 제출 결과: 성공
다른 풀이
자바 - Word
객체 선언
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.HashMap;
import java.util.TreeSet;
class Word implements Comparable<Word> {
final String value;
int freq;
final int len;
public Word(String value, int freq) {
this.value = value;
this.freq = freq;
this.len = value.length();
}
public String getValue() {
return value;
}
@Override
public int compareTo(Word w) {
if (this.freq == w.freq) { // 1. 자주 나오는 단어일수록 앞에 배치한다.
if (this.len == w.len) { // 2. 해당 단어의 길이가 길수록 앞에 배치한다.
return this.value.compareTo(w.value); // 3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
} else {
return w.len - this.len;
}
} else {
return w.freq - this.freq;
}
}
}
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
// ✅ 공백 기준으로 입력받기
StringTokenizer stk = new StringTokenizer(in.readLine());
int N = Integer.parseInt(stk.nextToken());
int M = Integer.parseInt(stk.nextToken());
HashMap<String, Integer> wordMap = new HashMap<>();
while (N-- > 0) {
String word = in.readLine();
if (word.length() < M) continue;
wordMap.put(word, wordMap.getOrDefault(word, 0) + 1);
}
TreeSet<Word> wordTree = new TreeSet<>();
for (Map.Entry<String, Integer> word: wordMap.entrySet()) {
wordTree.add(new Word(word.getKey(), word.getValue())); // 단어, 횟수
}
for (Word wrd: wordTree) {
out.write(wrd.getValue() + "\n");
}
out.close();
in.close();
}
}
- 테스트 케이스: 성공
- 제출 결과: 성공
- 참고로
TreeSet
을 사용하지 않고 아래처럼 하면 시간 초과가 난다..!// <단어, 빈도수> 입력받기 List<Word> wordLst = new ArrayList<>(); for (int i=0; i<N; i++) { String word = in.readLine(); if (word.length() < M) { continue; } boolean found = false; for (Word wrd: wordLst) { if (wrd.getValue().equals(word)) { wrd.updateFreq(); found = true; } } if (!found) { wordLst.add(new Word(word, 1)); // 넣기 } }
💛 개인 공부 기록용 블로그입니다. 👻