2 분 소요

사용 언어: Java

문제

영단어 암기는 괴로워

풀이

나의 풀이

자바

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

        String str[] = in.readLine().split(" ");
        int numbers[] = new int[str.length]; // array 초기화
        for (int i=0; i<str.length; i++) {
            numbers[i] = Integer.parseInt(str[i]);
        }

        // <단어, 빈도수> 입력받기
        Map<String, Integer> wordMap = new HashMap<String, Integer>();
        for (int i=0; i<numbers[0]; i++) {
            String word = in.readLine();
            if (word.length() >= numbers[1]) {
                Integer cnt = wordMap.getOrDefault(word, 0);
                wordMap.put(word, cnt+1);
            }
        }

        // 우선순위 역순으로 words를 정렬하면 된다!
        List<String> words = wordMap.keySet().stream().collect(Collectors.toList());
        words.sort((w1, w2) -> {
            int w1Cnt = wordMap.get(w1);
            int w2Cnt = wordMap.get(w2);

            if (w1Cnt == w2Cnt) {
                if (w1.length() == w2.length()){
                    return w1.compareTo(w2); // 3. 알파벳 사전 순으로 앞에 있는 단어일수록 
                }
                return w2.length() - w1.length(); // 2. 해당 단어의 길이가 길수록 앞에
            }
            return w2Cnt - w1Cnt; // 1. 자주 나오는 단어일수록 앞에
        });

        for (String word: words) {
            out.write(word + "\n");
        }
        out.close();
        in.close();
    }
}
  • 테스트 케이스: 성공
  • 제출 결과: 성공

다른 풀이

자바 - Word 객체 선언

참고

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.HashMap;
import java.util.TreeSet;

class Word implements Comparable<Word> {
    final String value;
    int freq;
    final int len;

    public Word(String value, int freq) {
        this.value = value;
        this.freq = freq;
        this.len = value.length();
    }

    public String getValue() {
        return value;
    }

    @Override
    public int compareTo(Word w) {
        if (this.freq == w.freq) { // 1. 자주 나오는 단어일수록 앞에 배치한다.
            if (this.len == w.len) { // 2. 해당 단어의 길이가 길수록 앞에 배치한다.
                return this.value.compareTo(w.value); // 3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다              
            } else {
                return w.len - this.len;
            }
        } else {
            return w.freq - this.freq;
        }
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

        // ✅ 공백 기준으로 입력받기
        StringTokenizer stk = new StringTokenizer(in.readLine());
        int N = Integer.parseInt(stk.nextToken());
        int M = Integer.parseInt(stk.nextToken());

        HashMap<String, Integer> wordMap = new HashMap<>();
        while (N-- > 0) {
            String word = in.readLine();
            if (word.length() < M) continue;
            wordMap.put(word, wordMap.getOrDefault(word, 0) + 1);
        }

        TreeSet<Word> wordTree = new TreeSet<>();
        for (Map.Entry<String, Integer> word: wordMap.entrySet()) {
            wordTree.add(new Word(word.getKey(), word.getValue())); // 단어, 횟수
        }

        for (Word wrd: wordTree) {
            out.write(wrd.getValue() + "\n");
        }
        out.close();
        in.close();
    }
}
  • 테스트 케이스: 성공
  • 제출 결과: 성공
  • 참고로 TreeSet을 사용하지 않고 아래처럼 하면 시간 초과가 난다..!
    // <단어, 빈도수> 입력받기
    List<Word> wordLst = new ArrayList<>();
    for (int i=0; i<N; i++) {
      String word = in.readLine();
      if (word.length() < M) {
          continue;
      }
      boolean found = false;
      for (Word wrd: wordLst) {
          if (wrd.getValue().equals(word)) {
              wrd.updateFreq();
              found = true;
          }
      }
      if (!found) {
          wordLst.add(new Word(word, 1)); // 넣기
      }
    }
    


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기