본문 바로가기
공부 정리/백준

[백준] 자바 4358 생태학

by 경적필패. 2021. 7. 15.
반응형

문제

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

입력

프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 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로 입력을 종료해야 함.

반응형

댓글