본문 바로가기
Algorithms/백준

[백준_4358]생태학 with Java

by jeomn 2021. 8. 4.

백준(BOJ) 문자열 문제집: 생태학(골드 5)

문제 출처: https://www.acmicpc.net/problem/4358

 

4358번: 생태학

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

www.acmicpc.net

 

이전에 Python으로 풀었던 문제

2021.06.24 - [Algorithms/백준] - [백준_4358]생태학 with Python

 

[백준_4358]생태학 with Python

백준(BOJ) 문자열 문제집: 생태학(골드 5) 문제 출처: https://www.acmicpc.net/problem/4358 4358번: 생태학 프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 3

jeomn.tistory.com

 

1. 알고리즘

Python때랑 알고리즘 자체는 똑같다...근데 자료형 때문에 고민이었음. 일단 HashMap을 사용해봤었으니까 HashMap에 데이터 저장하고, 정렬해서 풀었다. 그런데 TreeMap같이 정렬되는 애들 쓰면 훨씬 간편할 듯. 공부해야지...

  • 한 줄씩 입력받아 HashMap에 저장
    • 나무 갯수 카운팅
  • HashMap의 키 집합을 가져와서 정렬
  • 정렬한 데이터를 기준으로 반복, 비율 계산 후 출력
    • HashMap에 키로 데이터를 가져와 비율 계산
    • 출력

 

2. 유의 사항

  • Python 문제 풀이 글 참고

 

3. 어려웠던 점, 해결 방법

  • Python 때와 마찬가지로 끝까지 입력받는 게 힘들었음
    • BufferedReader로 readLine() 값이 null 이거나 readLine() 한 String 길이가 0일 때 중지하도록 함

 

 

4. 소스코드

자세한 설명은 주석 참고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
 
 
public class Main {
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        HashMap<String, Integer> trees = new HashMap<>();    //나무 데이터 저장할 HashMap
        double totalTrees = 0;    //전체 나무 갯수
        String tree;
        while((tree = br.readLine())!=null && tree.length()!=0) {    //입력받은 값이 null이거나 입력받은 값의 길이가 0일때 break
            // HashMap에 나무 데이터 저장
            //key=tree, value=값이 있으면 그 값, 없으면 0을 가져와서 +1  
            trees.put(tree, trees.getOrDefault(tree, 0)+1);
            totalTrees++;    //전체 나무 갯수 카운팅
        }
        
        Object[] treeKey = trees.keySet().toArray();    //HashMap의 Key데이터
        Arrays.sort(treeKey);                            //Key데이터(=나무 이름) 사전 순 정렬
        for(Object t: treeKey) {
            double rate = (trees.get(t)/totalTrees)*100;    //비율 계산
            String strRate = String.format("%.4f", rate);    //소숫점 넷째자리까지
            System.out.println(t+" "+strRate);                //출력
        }
            
    }
}
cs

 

5. 고민

  • 자료형 너무 많아...공부할 거 너무 많아...

댓글