import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Map;
import java.util.TreeMap;
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));
Integer totCnt = 0;
Map<String, Integer> treeMap = new TreeMap<>();
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
totCnt++;
treeMap.put(line, treeMap.getOrDefault(line, 0) + 1);
}
for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
double rt = (double) entry.getValue() / (double) totCnt * 100;
sb.append(entry.getKey() + " " + String.format("%.4f", rt)).append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
Keypoint
1. TreeMap
2. getOrDefault(Object key, V DefaultValue)
DefaultValue : key에 매핑된 value가 없으면 반환하는 기본값
3. treeMap.entrySet()
entrySet()은 Map의 모든 key-value 쌍을 Set 형태로 반환
이 구문이 좋은 이유
이유 | 설명 |
---|
가독성 | key , value 를 한 줄에 다룰 수 있음 |
성능 | Map.get(key) 처럼 다시 검색하지 않아도 됨 |
정렬 유지 | TreeMap 을 쓰면 자동으로 알파벳 순으로 정렬됨 |
3. StringBuilder
4. Scanner VS BufferedReader
항목 | Scanner | BufferedReader |
---|
📌 패키지 | java.util | java.io |
⚙️ 사용 용도 | 파싱(정수, 단어 등)까지 포함된 간단한 입력 처리 | 빠른 문자열 입력 처리에 적합 |
💨 성능 | 상대적으로 느림 (내부에서 파싱 처리 등) | 빠름 (버퍼 기반으로 입력 처리) |
🎯 주로 사용하는 메서드 | nextLine() , nextInt() 등 | readLine() |
🧠 내부 구현 | 파싱 기능 포함 (공백 기준 자동 분리) | 문자열만 입력받고 파싱은 직접 처리 |
🧰 유연성 | 간편하지만 느리고 덜 유연함 | 빠르지만 파싱 직접 처리해야 해서 복잡할 수 있음 |
❌ 예외 처리 | NoSuchElementException , InputMismatchException 등 | IOException 예외 처리 필요 |
요약
상황 | 추천 |
---|
간단한 콘솔 입력 처리 | Scanner 사용이 편함 |
대량 입력 / 빠른 처리 필요 (ex: 알고리즘 문제) | BufferedReader 추천 |
파일로부터 빠른 텍스트 입력 | BufferedReader 더 적합 |
5. System.out.println VS BufferedWriter
항목 | System.out.println | BufferedWriter |
---|
📌 주 용도 | 간단한 콘솔 출력 | 버퍼를 사용한 빠른 출력 (파일 또는 콘솔) |
💨 성능 | 느림 (출력마다 바로 출력됨 - flush 자동) | 빠름 (버퍼에 모았다가 한 번에 출력) |
🎯 출력 대상 | 기본은 콘솔 (System.out) | 콘솔, 파일 등 지정 가능 (FileWriter , OutputStreamWriter ) |
🔧 출력 방식 | 자동 줄바꿈 (println ), 직접 출력 (print ) | 줄바꿈 필요 시 bw.newLine() 또는 "\n" |
🧹 flush 처리 | 자동 | 수동 (bw.flush() 필요) |
❌ 예외 처리 | 필요 없음 | IOException 처리 필요 |
요약
상황 | 추천 |
---|
단순 디버깅, 콘솔 출력 | System.out.println |
속도 중요한 알고리즘 문제, 반복 많은 출력 | BufferedWriter + flush() |
파일에 출력 | BufferedWriter + FileWriter |