백준 | [Silver II] | 생태학 - 4358

bin·4일 전
0
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

항목ScannerBufferedReader
📌 패키지java.utiljava.io
⚙️ 사용 용도파싱(정수, 단어 등)까지 포함된 간단한 입력 처리빠른 문자열 입력 처리에 적합
💨 성능상대적으로 느림 (내부에서 파싱 처리 등)빠름 (버퍼 기반으로 입력 처리)
🎯 주로 사용하는 메서드nextLine(), nextInt()readLine()
🧠 내부 구현파싱 기능 포함 (공백 기준 자동 분리)문자열만 입력받고 파싱은 직접 처리
🧰 유연성간편하지만 느리고 덜 유연함빠르지만 파싱 직접 처리해야 해서 복잡할 수 있음
❌ 예외 처리NoSuchElementException, InputMismatchExceptionIOException 예외 처리 필요

요약

상황추천
간단한 콘솔 입력 처리Scanner 사용이 편함
대량 입력 / 빠른 처리 필요 (ex: 알고리즘 문제)BufferedReader 추천
파일로부터 빠른 텍스트 입력BufferedReader 더 적합

5. System.out.println VS BufferedWriter

항목System.out.printlnBufferedWriter
📌 주 용도간단한 콘솔 출력버퍼를 사용한 빠른 출력 (파일 또는 콘솔)
💨 성능느림 (출력마다 바로 출력됨 - flush 자동)빠름 (버퍼에 모았다가 한 번에 출력)
🎯 출력 대상기본은 콘솔 (System.out)콘솔, 파일 등 지정 가능 (FileWriter, OutputStreamWriter)
🔧 출력 방식자동 줄바꿈 (println), 직접 출력 (print)줄바꿈 필요 시 bw.newLine() 또는 "\n"
🧹 flush 처리자동수동 (bw.flush() 필요)
❌ 예외 처리필요 없음IOException 처리 필요

요약

상황추천
단순 디버깅, 콘솔 출력System.out.println
속도 중요한 알고리즘 문제, 반복 많은 출력BufferedWriter + flush()
파일에 출력BufferedWriter + FileWriter

0개의 댓글