반응형
문제
생태학에서 나무의 분포도를 측정하는 것은 중요하다. 그러므로 당신은 미국 전역의 나무들이 주어졌을 때, 각 종이 전체에서 몇 %를 차지하는지 구하는 프로그램을 만들어야 한다.
입력
프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어진다.
출력
주어진 각 종의 이름을 사전 순으로 출력하고, 그 종이 차지하는 비율을 백분율로 소수점 넷째 자리까지 반올림해 함께 출력한다.
테스트 케이스
접근
원하는 만큼 나무들을 입력받아서 그 나무들의 비율을 출력하는 문제입니다.
문제를 처음 접했을때 반복문을 언제 빠져야 되는지 언급해주지 않아서 좀 헤맸습니다.
결과적으로 이 문제에서는 ctrl+z 하는 경우를 입력 종료로 봅니다.
출력에서 정렬을 요구하기 때문에, hashmap 대신 treemap을 써주었습니다.
입력받을 때마다 map에서 해당하는 값을 +1해 주고 총 입력받은 나무의 개수로 나누어 준 후, 그대로 출력하니 문제가 해결되었습니다.
p.s 소수점 4자리 반올림이므로 double 타입을 사용해 주었습니다.
코드
import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
/*
4358 problem
*/
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
TreeMap<String,Integer> hsm = new TreeMap<>();
int count = 0;
//입력받은 값 개수 세주고 값 넣어주기
while(true) {
String str = br.readLine();
if(str==null || str.equals("")) {
break;
}
count++;
if(hsm.containsKey(str)) {
hsm.put(str, hsm.get(str)+1);
}
else {
hsm.put(str,1);
}
}
//총 개수로 나누어서 출력
Iterator it = hsm.keySet().iterator();
while(it.hasNext()) {
String key = (String) it.next();
double value = (double) (hsm.get(key)*100.0)/count;
bw.write(key+" "+String.format("%.4f", value)+"\n");
}
bw.flush();
bw.close();
}
}
주의
입력이 끝나는 방식에 주의 ctrl+z로 입력을 종료해야 함.
반응형
'공부 정리 > 백준' 카테고리의 다른 글
[백준] 자바 10866 덱 (0) | 2021.07.19 |
---|---|
[백준] 자바 16165 걸그룹 마스터 준석이 (0) | 2021.07.16 |
[백준] 자바 1269 대칭 차집합 (0) | 2021.07.14 |
[백준] 자바 2776 암기왕 (0) | 2021.07.13 |
[백준] 자바 1302 베스트셀러 (0) | 2021.07.12 |
댓글