Sliver
문제
화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.
- 자주 나오는 단어일수록 앞에 배치한다.
- 해당 단어의 길이가 길수록 앞에 배치한다.
- 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
𝑀 보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 𝑀 이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.
입력
첫째 줄에는 영어 지문에 나오는 단어의 개수 𝑁과 외울 단어의 길이 기준이 되는 𝑀이 공백으로 구분되어 주어진다. (1≤𝑁≤100000, 1≤𝑀≤10)
둘째 줄부터 번째 줄까지 외울 단어를 입력받는다. 이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는 을 넘지 않는다.
단어장에 단어가 반드시 1개 이상 존재하는 입력만 주어진다.
출력
화은이의 단어장에 들어 있는 단어를 단어장의 앞에 위치한 단어부터 한 줄에 한 단어씩 순서대로 출력한다.
풀이
import java.util.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException{
Scanner sc = new Scanner(System.in);
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());
Map<String, Integer> map = new HashMap<>();
for(int i=0; i<N; i++){
String str = br.readLine();
if(str.length() < M) continue;
map.put(str, map.getOrDefault(str, 0)+1);
}
List<String> keySet = new ArrayList<>(map.keySet());
keySet.sort((o1, o2) -> {
// 1. 자주 나오는 단어일수록 앞에 배치한다.
if(map.get(o1) != map.get(o2))
return map.get(o2) - map.get(o1);
// 2. 해당 단어의 길이가 길수록 앞에 배치한다.
if(o1.length() != o2.length())
return o2.length() - o1.length();
// 3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
return o1.compareTo(o2);
});
StringBuilder sb = new StringBuilder();
for(String key : keySet){
sb.append(key).append("\n");
}
System.out.print(sb);
sc.close();
}
}
해결방법
- HashMap을 사용하여 단어와 빈도를 저장
- 정렬을 위해 map.keySet()를 사용하여 Key의 집합을 리스트로 변환
- sort를 사용해 순서대로 정렬
https://www.acmicpc.net/problem/20920
'Algorithm > Baekjoon Oline Judge - Java' 카테고리의 다른 글
[백준] 덱2 / Dequq, LinkedList (0) | 2024.07.06 |
---|---|
[백준] 큐 2 / Queue, LinkedList (0) | 2024.07.06 |
[백준] 11050_이항계수1 (0) | 2024.06.23 |
[백준] 17103_골드바흐 파티션 / 에라토스테네스의 체 알고리즘 (1) | 2024.06.08 |
[백준] 18870_좌표압축 (1) | 2024.06.08 |