[ Algorithm ]/Baekjoon

[백준] 4358번 : 생태학

HoYoung Kim 2021. 10. 19. 18:08

조건

시간제한 : 1초

메모리제한 : 256MB


문제

생태학에서 나무의 분포도를 측정하는 것은 중요하다. 그러므로 당신은 미국 전역의 나무들이 주어졌을 때, 각 종이 전체에서 몇 %를 차지하는지 구하는 프로그램을 만들어야 한다.


입력

프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어진다.


출력

주어진 각 종의 이름을 사전순으로 출력하고, 그 종이 차지하는 비율을 백분율로 소수점 4째자리까지 반올림해 함께 출력한다.


알고리즘 분류

  • 자료구조
  • 문자열
  • 트리를 사용한 집합과 맵
  • 해시를 사용한 집합과 맵

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        HashMap<String, Integer> map = new HashMap<>();
        ArrayList<String> list = new ArrayList<>();
        int total = 0;

        while (true) {
            String str = br.readLine();
            if (str == null || str.equals("")) {
                break;
            }
            map.put(str, map.getOrDefault(str, 0) + 1);
            total++;
        }

        for (String s : map.keySet()) {
            list.add(s);
        }
        Collections.sort(list);

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i) + " " + String.format("%.4f", (double) map.get(list.get(i)) * 100 / total));
        }
    }
}