문제
생태학에서 나무의 분포도를 측정하는 것은 중요하다. 그러므로 당신은 미국 전역의 나무들이 주어졌을 때, 각 종이 전체에서 몇 %를 차지하는지 구하는 프로그램을 만들어야 한다.
입력
프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 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 |
'문제 > 백준' 카테고리의 다른 글
백준 9081번 단어 맞추기 [JAVA] (0) | 2021.07.08 |
---|---|
백준 1713번 후보 추천하기 [JAVA] (1) | 2021.07.04 |
백준 2242번 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 [JAVA] (0) | 2021.06.30 |
백준 1043번 거짓말 [JAVA] (0) | 2021.06.25 |
백준 2174번 로봇 시뮬레이션 [JAVA] (0) | 2021.06.25 |