[BaekJoon] 4358 생태학

오태호·2022년 4월 27일
0

1.  문제 링크

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

2.  문제


요약

  • 여러 개의 나무들이 주어졌을 때, 각 종이 전체에서 몇 %를 차지하는지 구하는 문제입니다.
  • 입력: 여러 개의 줄로 입력이 이루어져 있고 각 줄에는 나무 종 이름이 주어집니다.(입력은 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어집니다.)
  • 출력: 주어진 각 종의 이름을 사전순으로 출력하며 각 종이 차지하는 비율을 백분율로 소수점 4째자리까지 반올림해서 함께 출력합니다.

3.  소스코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;

public class Main {
	static ArrayList<String> trees;
	
	public LinkedHashMap<String, Double> getPercentage() {
		Collections.sort(trees);
		LinkedHashMap<String, Double> treesRemoveDupl = new LinkedHashMap<String, Double>();
		for(int i = 0; i < trees.size(); i++) {
			if(!treesRemoveDupl.containsKey(trees.get(i))) {
				treesRemoveDupl.put(trees.get(i), (double)1);
			} else {
				treesRemoveDupl.put(trees.get(i), treesRemoveDupl.get(trees.get(i)) + 1);
			}
		}
		double sum = 0;
		for(String key : treesRemoveDupl.keySet()) {
			sum += treesRemoveDupl.get(key);
		}
		for(String key : treesRemoveDupl.keySet()) {
			treesRemoveDupl.put(key, (treesRemoveDupl.get(key) / sum) * 100);
		}
		return treesRemoveDupl;
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		String input;
		trees = new ArrayList<String>();
		while((input = br.readLine()) != null) {
			trees.add(input);
		}
		br.close();
		Main m = new Main();
		LinkedHashMap<String, Double> percentage = m.getPercentage();
		for(String key : percentage.keySet()) {
			bw.write(key + " " + String.format("%.4f", percentage.get(key)) + "\n");
		}
		bw.flush();
		bw.close();
	}
}

4.  접근

  • 이 문제는 주어진 종들의 개수를 각각 파악해서 해당 개수들을 모두 더한 뒤에 각 개수를 전체 개수로 나눠줌으로써 백분율을 구하는 문제입니다.
  • 처음에는 Math.round()를 이용해서 소숫점 넷째자리까지 반올림을 하여 출력을 하였으나 Math.round()는 소숫점 아래가 0일 경우, 정수값으로 리턴하기 때문에 소숫점 넷째자리까지 표현하지 못하여 틀렸습니다.
  • Math.round()를 사용할 수 없었기 때문에 소숫점 아래 값이 0인 것도 출력해주는 String.format()을 이용하여 소숫점 넷째자리까지 표현하였습니다.

  1. 더 이상 입력이 주어지지 않을 때까지 나무들을 입력받고 입력받은 나무들을 사전순으로 정렬합니다.
  2. 각 나무들의 개수를 파악하기 위해 LinkedHashMap을 생성하고 만약 LinkedHashMap에 아직 해당 나무가 key로서 들어가있지 않다면 개수를 1로 하여 추가해주고 이미 해당 나무가 key로서 들어가있다면 개수를 1 증가시켜줍니다.
    • HashMap은 순서 상관없이 저장이 되기 때문에 나무들의 사전순서를 지켜주기 위해 LinkedHashMap을 이용하였습니다.
  3. 전체 나무들의 개수를 파악한 뒤에 각 개수들을 모두 더하여 전체 개수를 파악하고 각 나무들의 개수를 전체 개수로 나눈 뒤에 100을 곱해주어 백분율을 구합니다. 이 백분율을 만들어두었던 LinkedHashMap에 저장합니다.
  4. 해당 LinkedHashMap을 반환해주고 각 나무들의 종과 개수들을 출력할 때, 소숫점 넷째자리까지 반올림할 수 있도록 String.format()을 이용하여 출력합니다.
profile
자바, 웹 개발을 열심히 공부하고 있습니다!

0개의 댓글