[문제]
화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.
- 자주 나오는 단어일수록 앞에 배치한다.
- 해당 단어의 길이가 길수록 앞에 배치한다.
- 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.
보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가
[입력]
- 첫째 줄에는 영어 지문에 나오는 단어의 개수 N과 외울 단어의 길이 기준이 되는 M이 공백으로 구분되어 주어진다. (1≤N≤100000 1≤M≤10)
- 둘째 줄부터 N+1번째 줄까지 외울 단어를 입력받는다. 이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는 10을 넘지 않는다.
- 단어장에 단어가 반드시 1개 이상 존재하는 입력만 주어진다.
[코드]
import java.io.*;
import java.util.*;
public class BaekJoon_20920 {
static class word implements Comparable<word>{
String str;
int freq;
public word(String str, int freq) {
this.str=str;
this.freq=freq;
}
// 비교값의 결과가 양수이면 자리 변경
@Override
public int compareTo(word o) {
// TODO Auto-generated method stub
if(this.freq==o.freq) { // 1. 빈도수
if(this.str.length()==o.str.length()) // 2. 길이
return this.str.compareTo(o.str); // 3. 알파벳 순서
return o.str.length()-this.str.length();
}
else
return o.freq-this.freq;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st=new StringTokenizer(br.readLine());
HashMap<String, word> map=new HashMap<>();
ArrayList<String> arr=new ArrayList<>();
int n=Integer.parseInt(st.nextToken()); // 단어 개수
int m=Integer.parseInt(st.nextToken()); // 단어 최소 길이
for(int i=0;i<n;i++) {
String str=br.readLine();
if(str.length()<m) // 길이가 m보다 짧으면 제외
continue;
if(map.containsKey(str)) // 이미 나왔던 단어이면 빈도수 증가
map.get(str).freq++;
else { // 처음 나온 단어이면 map에 빈도수 0으로 추가, arr 리스트에 저장
map.put(str, new word(str,0));
arr.add(str);
}
}
ArrayList<word> result=new ArrayList<>(); // 결과 값 저장 연결리스트
// result 리스트에는 단어장에 추가될 단어들의 str, freq가 저장되어 있음(=word)
for(int i=0;i<arr.size();i++)
result.add(map.get(arr.get(i)));
Collections.sort(result);
for(int i=0;i<result.size();i++)
bw.write(result.get(i).str+"\n");
bw.flush();
}
}
[고찰]
이번 문제는 HashMap 자료구조를 잘 사용해야 해결할 수 있는 문제였다. 결과 값을 만족하는 단어는 다시 연결리스트에 저장하고, 그 단어에 해당하는 빈도수를 다시 가져오기 위해 HashMap의 값을 찾아오는 과정이 좀 복잡했다.
'백준' 카테고리의 다른 글
[백준_2512번] 예산 (0) | 2023.03.28 |
---|---|
[백준_19941번] 햄버거 분배 (0) | 2023.03.28 |
[백준_1205번] 등수 구하기 (0) | 2023.03.26 |
[백준_20125번] 쿠키의 신체 측정 (0) | 2023.03.26 |
[백준_25757] 임스와 함께하는 미니게임 (0) | 2023.03.24 |