컴퓨터/백준 알고리즘
백준 알고리즘 - 20920번: 영단어 암기는 괴로워 [Java]
이상한 나그네
2023. 10. 12. 00:50
문제: https://www.acmicpc.net/problem/20920
1. 코드
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());
Set <String> set = new TreeSet<>();
Map <String, Integer> map = new HashMap<>();
while(N-- > 0) {
String s = br.readLine();
if(s.length() >= M) {
set.add(s);
if(map.containsKey(s))
map.put(s, map.get(s) + 1);
else
map.put(s, 1);
}
}
List <String> list = new ArrayList<>(set);
Collections.sort(list, (a, b)->b.length() - a.length());
Collections.sort(list, (a, b)->map.get(b) - map.get(a));
StringBuilder sb = new StringBuilder();
for(String s : list)
sb.append(s).append('\n');
System.out.println(sb.toString());
}
}
2. 설명
Set <String> set = new TreeSet<>();
Map <String, Integer> map = new HashMap<>();
while(N-- > 0) {
String s = br.readLine();
if(s.length() >= M) {
set.add(s);
if(map.containsKey(s))
map.put(s, map.get(s) + 1);
else
map.put(s, 1);
}
}
TreeSet을 이용하여 문자열의 중복 제거와 알파벳 순서로 정렬을 입력과 동시에 진행합니다. HashMap을 이용하여 영단어의 빈번도를 확인합니다.
List <String> list = new ArrayList<>(set);
Collections.sort(list, (a, b)->b.length() - a.length());
Collections.sort(list, (a, b)->map.get(b) - map.get(a));
이미 영단어의 알파벳을 기준으로 오름차순으로 정렬이 된 상태에서 길이를 기준으로 오름차순으로 정렬한 뒤 빈번도를 기준으로 오름차순으로 정렬합니다.
StringBuilder sb = new StringBuilder();
for(String s : list)
sb.append(s).append('\n');
System.out.println(sb.toString());
StringBuilder를 사용하여 문자열을 한번에 저장한 뒤 출력해주면 문제는 해결됩니다.
3. 정리
- Collections.sort()에 대해서 알고 있으면 쉽게 해결할 수 있다.