자바 백준 20920번
실버 3
https://www.acmicpc.net/problem/20920
20920번: 영단어 암기는 괴로워
첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단
www.acmicpc.net
문제 보기
분류: 자료 구조, 문자열, 정렬, 해시를 사용한 집합과 맵, 트리를 사용한 집합과 맵
코드 보기
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.Collections;
import java.util.Set;
import java.util.HashSet;
public class Main {
public static void main(String[] args) throws IOException {
// 입력과 출력을 위한 BufferedReader와 BufferedWriter 생성
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()); // 외울 단어의 최소 길이
// 단어와 빈도수를 저장하기 위한 리스트와 맵 생성
List<String> words = new ArrayList<>();
Map<String, Integer> frequencyMap = new HashMap<>();
// 단어 입력과 빈도수 계산
for (int i = 0; i < N; i++) {
String word = br.readLine();
words.add(word);
frequencyMap.put(word, frequencyMap.getOrDefault(word, 0) + 1);
// 1. frequencyMap에서 현재 단어 word를 찾음.
// 2. 만약 word가 이미 frequencyMap에 존재한다면, 해당 단어의 빈도수를 가져옴
// 3. 그 빈도수에 1을 더하고, 다시 frequencyMap에 word와 업데이트된 빈도수를 저장
// 4. 만약 word가 frequencyMap에 존재하지 않는다면, getOrDefault 메서드를 사용하여 0을 기본값으로 가져온 뒤, 1을 더하고 word와 빈도수 1을 저장
}
// 단어 정렬 함수 호출
sortWords(words, frequencyMap);
// 중복을 제거하고 출력하는 함수 호출
Set<String> printedWords = new HashSet<>();
printWords(words, printedWords, M, bw);
// 출력 버퍼 비우고 닫기
bw.flush();
bw.close();
br.close();
}
// 단어 정렬 함수
private static void sortWords(List<String> words, Map<String, Integer> frequencyMap) {
// Collections.sort를 사용하여 words 리스트를 정렬
// Comparator를 사용하여 단어의 정렬 기준을 지정
Collections.sort(words, (a, b) -> {
// 각 단어의 빈도수를 가져옴
int freqA = frequencyMap.get(a);
int freqB = frequencyMap.get(b);
// 1. 자주 나오는 단어가 먼저 오도록 빈도수를 비교
if (freqA != freqB) {
return Integer.compare(freqB, freqA); // freqB가 freqA보다 크면 freqB가 앞에 위치
}
// 2. 빈도수가 같은 경우, 길이가 긴 단어가 먼저 오도록 길이를 비교
else if (a.length() != b.length()) {
return Integer.compare(b.length(), a.length()); // b의 길이가 a의 길이보다 크면 b가 앞에 위치
}
// 3. 길이도 같은 경우, 알파벳 순서로 정렬
else {
return a.compareTo(b); // a와 b를 알파벳 순서로 비교하여 정렬
}
});
}
// 중복을 제거하고 출력하는 함수
private static void printWords(List<String> words, Set<String> printedWords, int M, BufferedWriter bw)
throws IOException {
for (String word : words) {
if (word.length() >= M && !printedWords.contains(word)) {
bw.write(word + "\n"); // 출력
printedWords.add(word); // 이미 출력한 단어 기록
}
}
}
}
References
https://www.javatpoint.com/java-bufferedreader-class
Java BufferedReader Class - javatpoint
Java BufferedReader Class for beginners and professionals with examples on Java IO or Input Output in Java with input stream, output stream, reader and writer class. The java.io package provides api to reading and writing data.
www.javatpoint.com
https://www.javatpoint.com/string-tokenizer-in-java
StringTokenizer in Java - javatpoint
Java StringTokenizer class in java breaks a string into tokens. There are nextToken() method, hasMoreTokens() method, countTokens() method to deal with tokens in java.
www.javatpoint.com
https://www.programiz.com/java-programming/library/hashmap/getordefault
Java HashMap getOrDefault()
Otherwise, the method returns the value corresponding to the specified key. The syntax of the getOrDefault() method is: hashmap.get(Object key, V defaultValue) Here, hashmap is an object of the HashMap class. getOrDefault() Parameters The getDefault() meth
www.programiz.com
https://www.javatpoint.com/how-to-sort-hashmap-by-value
How to Sort HashMap by Value - Javatpoint
How to Sort HashMap by Value with oops, string, exceptions, multithreading, collections, jdbc, rmi, fundamentals, programs, swing, javafx, io streams, networking, sockets, classes, objects etc,
www.javatpoint.com
'공부하기 > 백준' 카테고리의 다른 글
[Python] 백준 풀기 15894 - 수학은 체육과목 입니다 (0) | 2023.10.06 |
---|---|
[Java] 백준 풀기 2903 - 중앙 이동 알고리즘 (2) | 2023.10.05 |
[Java] 백준 풀기 9933 - 민균이의 비밀번호 (0) | 2023.09.25 |
[Java] 백준 풀기 9465 - 스티커 (0) | 2023.09.24 |
[Java] 백준 풀기 2556 - 별 찍기 14 (0) | 2023.09.23 |