백준

[백준_20920] 영단어 암기는 괴로워

빙수빈수 2023. 3. 28. 16:35

[문제]

 화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.

 

  1. 자주 나오는 단어일수록 앞에 배치한다.
  2. 해당 단어의 길이가 길수록 앞에 배치한다.
  3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다

  보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.

 

[입력]

  • 첫째 줄에는 영어 지문에 나오는 단어의 개수 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