본문 바로가기
코딩테스트 준비/백준

[백준] 4358번 - 생태학 [Java]

by mwzz6 2024. 12. 10.

https://www.acmicpc.net/problem/4358

 

[백준] 4358번 - 생태학 [Java]
[백준] 4358번 - 생태학 [Java]
[백준] 4358번 - 생태학 [Java]


1.  아이디어

 

종의 이름을 사전순으로 출력해야 하는 점에서 TreeMap 자료구조를 활용해서 구현했다.


2. 문제풀이

 

TreeMap의 key에는 종의 이름, value에는 등장 횟수를 저장한다.

이후 출력을 위한 포맷팅 과정에서 향상된 for문으로 Entry를 꺼내서 key와 value를 이용할 수 있게 했는데, 종이 차지하는 비율을 백분율로 소수점 4째자리까지 출력하기 위해 round라는 메서드를 정의해서 이용했다.

 

round 메서드는 비율을 처리하는 메서드로 소수점 4번째 자리가 0일 경우에도 0을 출력하기 위해 String.format을 활용했다.


3. 코드

 

import java.io.*;
import java.util.*;

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));
        StringBuilder sb = new StringBuilder();

        String input;
        Map<String, Integer> map = new TreeMap<>();
        int cnt = 0;

        while ((input = br.readLine()) != null) {
            map.put(input, map.getOrDefault(input, 0) + 1);
            cnt++;
        }

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            int value = entry.getValue();

            sb.append(key).append(" ").append(round(value, cnt, 4)).append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
    }

    private static String round(double value, int cnt, int places) {
        return String.format("%.4f", Math.round(value / cnt * Math.pow(10, places + 2)) / Math.pow(10, places));
    }

}

4. 후기