본문 바로가기

알고리즘

[BOJ] 4358번 : 생태학 (JAVA)

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

 

4358번: 생태학

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

www.acmicpc.net

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));
        HashMap<String, Integer> hashMap = new HashMap<>();
        int total = 0;
        while(true){
            String tree = br.readLine();
            if(tree==null) break;
            //나무 명 입력 받아서 hashmap에 넣는다.
            //넣기 전에 hashmap에 그 나무 이름 있는지 검사
            //있으면 그루 수 ++
            //없으면 나무 넣기
            total++;
            if(hashMap.containsKey(tree)){
                int cnt = hashMap.get(tree);
                hashMap.put(tree, cnt + 1);
            }
            else{
                hashMap.put(tree,1);
            }
        }

        //정렬
        Map<String, Integer> sortedMap = new TreeMap<>(hashMap);

        //출력
        for(Map.Entry<String, Integer> entry: sortedMap.entrySet()){
            double treeCnt = entry.getValue();
            System.out.println(entry.getKey()+" "+String.format("%.4f",treeCnt/total*100));
        }

    }
}

입력이 언제 끝나는지 모를 때에는 br.readLine()==null일 때 멈추게 하면 된다.

처음에 br.readLine().equals("")로 했다가 NullPointerException이 났다.

HashMap 사용, 정렬에는 TreeMap 사용

반올림 자리수 출력에는 String.format("%.4f", number)을 사용했다.

 

if(hashMap.containsKey(tree)){
    int cnt = hashMap.get(tree);
    hashMap.put(tree, cnt + 1);
}
else{
    hashMap.put(tree,1);
}

이 부분을 getOrDefault를 써서 구현할 수도 있다.

hashMap.put(tree, hashMap.getOrDefault(tree,0)+1);

어디서 getOrDefault를 쓰면 성능이 떨어진다는 말을 들었는데 이 부분은 알아보아야겠다.

 

HashMap 정리 : https://tech-heng.tistory.com/55