BOJ 4358 생태학

LONGNEW·2021년 4월 4일
0

BOJ

목록 보기
220/333

https://www.acmicpc.net/problem/4358
시간 1초, 메모리 256MB
input :

  • 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어진다.

output :

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

모든 나무들의 입력횟수를 기록하는 변수를 이용해서, 각 나무들의 입력된 횟수를 나눔으로 정답을 출력할 수 있습니다.

파이썬으로 하려 했지만, 파이썬이 시간복잡도를 감당하지 못해서 자바로 풀어봅시다.

딕셔너리 형태를 이용해야 하니까, Map을 통해서 "나무의 종" : 입력 횟수 를 저장합니다.

횟수를 기록한 후, key값들을 사전순으로 정렬하여야 합니다.
자바에서 key값들을 다 받아내는 방법은 data.keySet()을 이용합니다.
이를 통해 얻어낸 Set을 List로 바꾸어 줍니다.

그리고 이 구조를 Array(배열, List 아님)로 바꾸기 위해 .toArray()를 사용합니다.

Object[] keys = data.keySet().toArray();
        Arrays.sort(keys);

이후 keys에 존재하는 값들을 출력 하면서 입력된 비율을 출력해야 하는데
입력 횟수 / 전체 횟수 * 100 을 통해 비율을 만들어 주고, 4째 자리 까지 출력하기 위해 String.format("%.4f", ans)를 이용합니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;

public class App {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static HashMap<String, Integer> data = new HashMap<>();

    public static void main(String[] args) throws IOException {
        String s = "";
        int total = 0;

        while ((s = br.readLine()) != null){

            if (data.containsKey(s)){
                int cnt = data.get(s);
                data.put(s, cnt + 1);
            }else
                data.put(s, 1);

            total++;
        }

        Object[] keys = data.keySet().toArray(new String[0]);
        Arrays.sort(keys);

        for (Object item : keys){
            int temp = data.get(item);
            double ans = (double)temp / total * 100;
            System.out.println((String) item + " " + String.format("%.4f", ans));
        }
    }
}

0개의 댓글