본문 바로가기
백준

[백준] 4358번 : 생태학 – JAVA [자바]

by Hongwoo 2022. 4. 26.
반응형

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

 

4358번: 생태학

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

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 4358번 생태학은 실버 1 난이도의 문자열 및 맵을 이용한 자료 구조 문제이다. 이 문제에서는 나무의 이름들이 입력으로 주어진다. 이 문제에서는 입력이 언제 종료되는지 모르고 계속 들어오기 때문에 while-loop을 다음과 같이 써야 한다. 이렇게 쓰면 입력받은 것이 없으면 loop을 종료시킨다. 

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
while ((s = br.readLine()) != null) {
  do something
}

 

이렇게 쓰면 계속해서 BufferedReader에서 입력을 받고 더 이상 입력받을 게 없으면 loop을 종료시킨다.

 

이 문제는 HashMap을 이용해서 풀 것이다. HashMap을 선언하는데 키는 나무의 이름으로 할 거여서 String형, 그리고 값으로는 그 나무가 몇 번 나오는지 저장해야 되니 Integer로 선언할 것이다. 따라서 getOrDefault 함수를 다음과 같이 써준다. 

 

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

 

마지막의 나무의 종을 사전 순으로 정렬된 채로 출력을 해야 하기 때문에 모든 종을 또 ArrayList에 추가한 다음 정렬해준다. 이제 나무의 종이 정렬된 채로 리스트에 있으니 그 종들이 차지하는 비율을 백분율과 같이 출력해주면 된다. 이는 String.format 함수를 이용할 것이다.

 

우선 그 종이 몇 개인지가 맵에 값으로 저장되어 있다. 따라서 리스트를 iterate 하면서 map.get(tree)를 이용해서 count를 구한다. 그리고 백분율로 구해야 하니 100을 곱해준다. 그것들을 소수 자리 4자리로 구하려면 다음과 같이 쓰면 된다.

 

String.format("%.4f", number);

 

이렇게 하면 모든 종의 비율을 백분율로 구할 수 있다.

 


  • 코드
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));
        String s;
        int total = 0;
        Map<String, Integer> map = new HashMap<>();
        while ((s = br.readLine()) != null) {
            total++;
            map.put(s, map.getOrDefault(s, 0) + 1);
        }
        List<String> list = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String tree = entry.getKey();
            list.add(tree);
        }
        Collections.sort(list);
        StringBuilder sb = new StringBuilder();
        for (String tree : list) {
            int count = map.get(tree) * 100;
            sb.append(tree + " " + String.format("%.4f", (double)count / (double)total) + "\n");
        }
        System.out.print(sb);
    }
}

  • 후기

비록 여러 단계를 거쳐야 풀 수 있는 문제이기는 했지만 그래도 풀 만한 문제였던 거 같다.

 

 

반응형

댓글