플밍/문제풀이

[Java] BOJ4358, 백준 - 생태학

kkap999 2021. 8. 23. 19:54
728x90

https://www.acmicpc.net/problem/4358

 

4358번: 생태학

프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초  256MB 6097 2345 1619 37.660%

문제

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

 

입력

프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어진다.

 

출력

주어진 각 종의 이름을 사전순으로 출력하고, 그 종이 차지하는 비율을 백분율로 소수점 4째자리까지 반올림해 함께 출력한다.

 

<풀이>

  1. Key값으로 나무 이름을, Value값으로 나무 수를 저장할 HashMap을 만든다.
  2. 나무의 이름들을 차례로 입력받아서 HashMap에 저장한다.
    1. 만약 이전에 입력된 적 있던 나무가 나올 경우 key값을 통해 찾아서 value값을 1 증가시켜준다.
    2. 처음 입력되는 나무라면 나무 수는 한그루이기 때문에 value값에 1을 저장한다.
  3. 다 저장되었다면 HashMap을 나무이름순으로 정렬하여 전체 나무 수 대비 비율을 출력한다.

 

사실 알고리즘 자체가 어렵다기보다는 이것저것 처리하거나 사용하는게 귀찮은 문제,,,

  • EOF 처리
    • 이상하게 이 문제는 조건에 !(s = br.readLine()).equals("")를 넣으면 에러가 난다
    • (s = br.readLine()) != null) 로 처리해주었다.
  • HashMap 사용
  • HashMap key값에 따라서 정렬
    • Object[] key = hm.keySet().toArray();
    • Arrays.sort(key);
  • 소수점 넷째자리까지 반올림
    • String.format 사용

 

소스코드

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));
		StringBuilder sb = new StringBuilder();

		// key, value값을 차례로 준다
		HashMap<String, Integer> hm = new HashMap<String, Integer>();

		String s = "";
		int n = 0; // 총 나무 수

		// EOF처리
		while ((s = br.readLine()) != null) {
			n++;
			// 이미 그 나무가 HashMap 안에 존재한다면
			if (hm.containsKey(s)) {
				// 나무 개수에 +1을 한다.
				hm.put(s, hm.get(s) + 1);
			} else {
				// 처음 추가되는 나무라면 나무 개수는 1
				hm.put(s, 1);
			}
		}

		// Key값 순서대로 정렬
		Object[] key = hm.keySet().toArray();
		Arrays.sort(key);

		// 출력 조건에 따라서 출력
		for (int i = 0; i < key.length; i++) {
			int val = hm.get(key[i]);
			double rate = (double) (100 * val) / n;
			sb.append(key[i] + " " + String.format("%.4f", rate) + "\n");
		}
		System.out.println(sb);
	}
}

'플밍 > 문제풀이' 카테고리의 다른 글

[Java] BOJ2212, 백준 - 센서  (0) 2021.08.24
[Java] BOJ1987, 백준 - 알파벳  (0) 2021.08.24
[Java] BOJ1747, 백준 - 소수&팰린드롬  (0) 2021.08.23
[Java] BOJ1662, 백준 - 압축  (0) 2021.08.18
[Java] BOJ1781, 백준 - 컵라면  (0) 2021.08.16