https://www.acmicpc.net/problem/4358
- 문제
- 문제 풀이
백준 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);
}
}
- 후기
비록 여러 단계를 거쳐야 풀 수 있는 문제이기는 했지만 그래도 풀 만한 문제였던 거 같다.
'백준' 카테고리의 다른 글
[백준] 2443번 : 별 찍기 - 6 – JAVA [자바] (0) | 2022.04.26 |
---|---|
[백준] 9375번 : 패션왕 신해빈 – JAVA [자바] (0) | 2022.04.26 |
[백준] 1269번 : 대칭 차집합 – JAVA [자바] (0) | 2022.04.26 |
[백준] 14425번 : 문자열 집합 – JAVA [자바] (1) | 2022.04.26 |
[백준] 2444번 : 별 찍기 - 7 – JAVA [자바] (0) | 2022.04.23 |
댓글