Backend
home
🏴󠁧󠁢󠁥󠁮󠁧󠁿

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

생성일
2025/02/05 02:23
태그
BaekJoon
게시일
2025/02/05
최종 편집 일시
2025/02/05 02:32

문제

해결 방안 고민

3가지 조건 정리
자주 나오는 단어일수록 앞에 배치
해당 단어의 길이가 길수록 앞에 배치
길이가 M 이상인 단어들만 외움 ⇒ M 이상인 단어들만 고려
알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치 ⇒ 정렬 필요 (오름차순 정렬)

해결 방법

리스트 반환 함수를 만들어서 3가지 조건을 충족시키는 로직을 구현하고자 함
stream을 활용하여 영단어만 뽑아서 리스트로 구성
빈도수(조건1), 길이 SAME(조건2), 앞에 배치(조건 3) 고려하는 조건문 작성
wordList.sort((o1, o2) -> { int c1 = map.get(o1); // 빈도수 int c2 = map.get(o2); // 빈도수 if (c1 == c2) { // 빈도수가 같으면 (조건 1) if (o1.length() == o2.length()) { // 단어의 길이가 같으면 (조건 2) return o1.compareTo(o2); // 조건 3. 알파벳 사전 순으로 앞에 있는 단어 일수록 앞에 배치 } return o2.length() - o1.length(); } return c2 - c1; // 1. 자주 나오는 단어 일수록 앞에 배치 });
Java
복사

코드

조건에 대한 로직을 구현하는 게 생각보다 쉽지 않았음
compareTo 를 활용하여 정렬할 수 있는 방법 숙지
함수를 따로 구성하여 처리하는 로직을 활용할 필요가 있음을 느낌
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; // 영단어 암기는 괴로워 - 실버 3 // 3가지 조건 // 자주 나오는 단어는 앞에 배치 (조건 1) // 해당 단어의 길이가 길수록 앞에 배치 (조건 2) // 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치 => 알파벳 소문자, 단어 길이는 10을 넘지 않음 (조건 3) public class Main { 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(), " "); int N = Integer.parseInt(st.nextToken()); // 단어의 개수 int M = Integer.parseInt(st.nextToken()); // 외울 단어의 기준이 되는 M // 스트링 배열 선언 및 배열 요소 입력 String[] words = new String[N]; int length = words.length; for (int i = 0; i < length; i++) { words[i] = br.readLine(); } br.close(); List<String> answer = findAnswer(words); for (String s : answer) { if (s.length() < M) { continue; } bw.write(s + "\n"); } bw.flush(); bw.close(); } // 조건 1 ~ 3을 처리하여 배열을 반환시키는 메소드 public static List<String> findAnswer(String[] array) { // 단어와 갯수의 데이터를 담은 hashmap 만들기 HashMap<String, Integer> map = new HashMap<>(); for (String str : array) { if (map.containsKey(str)) { // 해당 word를 key 값으로 가지며, 그 key 값의 value(지금까지의 빈도수) + 1 map.put(str, map.get(str) + 1); } else { // 한 번도 마주치지 않은 경우 빈도수는 당연히 1이므로 value는 1 값을 가짐 map.put(str, 1); } } // 키 값이 영단어인데 해당 영단어만 뽑아서 리스트로 만듦 List<String> wordList = map.keySet().stream().collect(Collectors.toList()); wordList.sort((o1, o2) -> { int c1 = map.get(o1); // 빈도수 int c2 = map.get(o2); // 빈도수 if (c1 == c2) { // 빈도수가 같으면 (조건 1) if (o1.length() == o2.length()) { // 단어의 길이가 같으면 (조건 2) return o1.compareTo(o2); // 조건 3. 알파벳 사전 순으로 앞에 있는 단어 일수록 앞에 배치 } return o2.length() - o1.length(); } return c2 - c1; // 1. 자주 나오는 단어 일수록 앞에 배치 }); return wordList; } }
Java
복사