문제

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

 

입력

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

 

출력

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

 

예제

 

풀이 방법

나무들이 주어졌을 때, 각 나무의 종이 전체에서 몇 %를 차지하는지 구하는 문제였습니다.

이 문제를 읽어봤을 때, HashMap을 이용해서 풀면 되겠구나 라는 생각을 먼저 했습니다. 나무의 종을 입력받고 만약 HashMap의 key 값에 tree가 포함되어 있지 않을 경우에는 같은 종이 없다는 의미므로 <tree 명, 1> 쌍의 <키, 값>을 HashMap에 넣어주었습니다. 반대로 이미 있는 경우에는 value값만 +1 해주었습니다. 나무를 다 입력받고 난 후, 사전 순으로 정렬하기 위해 ArrayList에 HashMap에 넣었던 데이터들을 넣어주고 정렬해주었습니다. 마지막으로 전체에서 얼마나 차지하는지를 구하기 위해 계산해주고 출력해주었습니다.

 

이 문제를 풀면서 NullPointer 런타임 에러가 발생했습니다.ㅠㅠㅠ 에러를 찾던 중, 32번 줄에서 발생한다는 것을 알고 수정했더니 통과할 수 있었습니다.ㅠㅠㅠㅠ

 

코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
 
public class Main_BJ_4358_생태학 {
    
    static class info{
        String tree;
        int cnt;
        
        public info(String tree, int cnt) {
            this.tree = tree;
            this.cnt = cnt;
        }    
    }
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        HashMap<String, Integer> hm = new HashMap<String, Integer>();
        
        int count=0;
        while(true) {
            String tree = br.readLine();
            
            if(tree==null || tree.equals("")) break;
            count++;
            if(!hm.containsKey(tree)) hm.put(tree,1);
            else hm.put(tree, hm.get(tree)+1);
        }
        
        ArrayList<info> list = new ArrayList<>();
        Iterator<String> keys = hm.keySet().iterator();
        while(keys.hasNext()) {
            String tree1 = keys.next();
            list.add(new info(tree1,hm.get(tree1)));
        }
        
        Collections.sort(list, new Comparator<info>() {
 
            @Override
            public int compare(info o1, info o2) {
                return o1.tree.compareTo(o2.tree);
            }
        });
        
        for(int i=0;i<list.size();i++) {
            double per = (double)(list.get(i).cnt*100.0)/count;
            
            sb.append(list.get(i).tree+" "+String.format("%.4f", per)+"\n");
        }
        System.out.println(sb.toString());
    }
 
}
cs

 

+ Recent posts