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

 

4358번: 생태학

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

www.acmicpc.net

코드설명

HashMap + toArray를 활용합니다.

 

문제에서 알면 좋은 함수들이 많았습니다.

 

1. hashmap.keySet().toArray();

Object[] keyArr = hashmap.keySet().toArray();
Arrays.sort(keyArr);

이 코드에서는 자동으로 keySet을 Array로 Object 형식으로 반환합니다.

물론, String으로 Casting 하여도 되지만, 모든 자료형은 Object를 상속하고 있기에 단순히 Object를 사용해도 괜찮습니다.

그리고 Arrays.sort(keyArr)으로 오름차순으로 출력하도록 합니다.

 

물론, PriorityQueue나 이런것들을 활용해도 되겠지만, 그렇게했다면 코드가 길어졌을 것 입니다.

 

2. String.format("%.4f", percentage) 로 소수점 넷째짜리까지 반올림합니다.

double percentage = ( (double) value / (double) count) * 100;
sb.append(keyArr[i]+" ").append(String.format("%.4f", percentage) + "\n");

 

 

코드

package algorhythm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;

public class Main {
	public static int N, T;
	public static HashMap<String, Integer> hashmap = new HashMap<String, Integer>();
	public static int answer = 0;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//		StringTokenizer st = new StringTokenizer(br.readLine());

		//전체 나무의 개수를 구합니다.
		int count = 0;
		while(true) {
			String input = br.readLine();
			if(input == null || input.equals("")) {
				break;
			}
			hashmap.put(input, hashmap.getOrDefault(input, 0) + 1);
			count += 1;
		}
		
		Object[] keyArr = hashmap.keySet().toArray();
		Arrays.sort(keyArr);
		
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<keyArr.length;i++) {
			//해당 종의 개수.
			int value = hashmap.get(keyArr[i]);
			double percentage = ( (double) value / (double) count) * 100;
			sb.append(keyArr[i]+" ").append(String.format("%.4f", percentage) + "\n");
		}
		System.out.println(sb.toString());
	}
}

 

두번쨰 코드입니다.

package Main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.TreeMap;
 
public class Main {
	public static int N, C, H, W, K, M, T;
	public static int answer = 0;
	public static TreeMap<String, Integer> hashmap = new TreeMap<>();
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String line;
		int cnt = 0;
		while( (line = br.readLine()) != null && !line.equals("")) {
			hashmap.put(line, hashmap.getOrDefault(line, 0) + 1);
			cnt += 1;
		}
		
		for(Map.Entry<String, Integer> entrySet : hashmap.entrySet()) {
			double percent = ( (double) entrySet.getValue() * 100 / cnt);
			System.out.print(entrySet.getKey());
			System.out.printf(" %.4f\n", percent);
		}
	}
	
}

+ Recent posts