https://www.acmicpc.net/problem/20920
문제
- 첫째 줄에 단어의 수 N과 단어의 길이 기준 M ( 1 <= N <= 100000, 1 <= M <= 10 ) 이 입력된다.
- 둘째 줄부터 N + 1개의 줄에 외울 단어 ( 1 <= 단어의 길이 <= 10 ) 를 입력 받는다.
-
- 자주 나오는 단어일수록 앞에 배치한다.
- 해당 단어의 길이가 길수록 앞에 배치한다.
- 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다.
- 3번의 우선순위를 차례로 적응하여 영어 단어장을 만든다.
- 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));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
HashMap<String, Integer> count = new HashMap<>();
for (int i = 0; i < N; i++) {
String word = br.readLine();
if (word.length() >= M) {
count.put(word, count.getOrDefault(word, 0) + 1);
}
}
String[] list = count.keySet().toArray(new String[0]);
Arrays.sort(list); // 사전 순서
Arrays.sort(list, Comparator.comparingInt(String::length).reversed()); // 단어 길이
Arrays.sort(list, (o1, o2) -> { // 단어 횟수
return count.get(o2) - count.get(o1);
});
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (String s : list) {
bw.write(s + "\n");
}
bw.flush();
bw.close();
}
}
다른 사람들에 비해 시간이 좀 오래 걸렸다.
조금 줄어든 코드
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));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
HashMap<String, Integer> count = new HashMap<>();
for (int i = 0; i < N; i++) {
String word = br.readLine();
if (word.length() >= M) {
count.put(word, count.getOrDefault(word, 0) + 1);
}
}
String[] list = count.keySet().toArray(new String[0]);
Arrays.sort(list); // 사전 순서
Arrays.sort(list, Comparator.comparingInt(String::length).reversed()); // 단어 길이
Arrays.sort(list, (o1, o2) -> { // 단어 횟수
return count.get(o2) - count.get(o1);
});
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s).append("\n");
}
System.out.println(sb);
}
}
BufferedWriter 대신 StringBuilder를 써봤는데 30ms 정도 차이가 났다.
원래도 Scanner는 시간 문제 같은 것으로 인해 사용하지 않은 게 제법 오래 됐는데 BufferedWriter를 사용하라는 것처럼 적혀 있어서 사용해보았더니 딱히 좋은 효과는 보지 못한 것 같다.
'백준 문제 풀이 > 백준 (JAVA)' 카테고리의 다른 글
JAVA 백준 11068 회문인 수 (브루트포스) (0) | 2025.05.12 |
---|---|
JAVA 11005 진법 변환 2 (구현) (0) | 2025.05.11 |
JAVA 백준 10431 줄세우기 (정렬) (0) | 2025.05.10 |
JAVA 백준 2108 통계학 (수학, 정렬) (0) | 2025.05.09 |
JAVA 백준 2346 풍선 터뜨리기 (큐) (0) | 2025.05.09 |