문제풀이/백준
[백준]4358: 생태학 - JAVA
빈둥벤둥
2021. 4. 29. 15:39
[백준]4358: 생태학
4358번: 생태학
프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어
www.acmicpc.net
풀이
자료구조 관련된 문제로 HashMap을 사용해서 풀었다.
HashMap으로 문자열을 입력받고, 해당 문자열이 총 몇번 입력되었는지를 key와 value쌍으로 저장해 주었다. 그 다음에 key값만을 배열로 만들어 오름차순 정렬한 후 조건에 맞게 계산해 주었다.
이번 문제를 풀면서 key값만을 가져올 수 있는 방법을 알게 되었다. 아래와 같이 KeySet().toArray()함수를 사용하여 Object형으로 반환하여 key값을 뽑아낼 수 있다.
Object[] keyArr = map.keySet().toArray();
Arrays.sort(keyArr);
그 다음으로 이 문제에서 런타임 에러를 만나게 된다면 입력 받는 부분에서 문제가 있는 가능성이 크다. 문제에서 입력 받는 개수에 대한 제약조건이 따로 명시되어 있지 않다. 그래서 처음에는 엔터를 두 번 입력 받았다면 입력을 그만 받도록 하였다. 하지만 이 문제에서는 ctrl + z, 즉 EOF를 판단하여 입력을 그만 받도록 해야 한다. 따라서 이 부분을 고치면 런타임 에러는 없어질 것이당!
코드
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
|
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
HashMap<String ,Integer> map = new HashMap<>();
int count = 0;
while(scan.hasNextLine()) {
String str = scan.nextLine();
map.put(str, map.getOrDefault(str, 0) + 1);
count++;
}
Object[] keyArr = map.keySet().toArray(); // 키 값을 배열로 받아옴
Arrays.sort(keyArr);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < keyArr.length; i++) {
int value = map.get(keyArr[i]);
double percent = ((double)value /(double) count) * 100;
sb.append(keyArr[i] + " " + String.format("%.4f", percent) + "\n");
}
System.out.println(sb.toString());
}
}
|
cs |