반응형
05-14 05:47
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발하는 고라니

[백준] 4358번 : 생태학 본문

Programming/백준

[백준] 4358번 : 생태학

조용한고라니 2021. 3. 28. 03:04
반응형
 

4358번: 생태학

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

www.acmicpc.net


[문자열 + Map]

우선 문제의 입력은 마지막이 특별한 조건이 없으므로 입력받은 값이 Null 또는 공백일 때 입력을 종료한다. 나는 BufferedReader를 썻지만, Scanner를 사용한다면 hasNextLine()을 사용할 수 있을지도 모르겠다.

 

Map을 이용해서 나무 이름으로 Key를, 그 나무 이름이 나오는 횟수를 Value로 설정하고 값을 계속 업데이트하자. 그러면 해당 나무가 몇 번 이름 불렸는지 알게되는데, 문제에서는 이름 순으로 정렬하라고 했고, 그 때의 백분율을 소수 4자리 수까지 출력하라고 했다. 이 부분은 굉장히 중요하므로 간과하지 말자.

 

처음에는 소수 4자리라길래

Math.round(map.get(key) * 100.0f * 10000.0f / size) / 10000.0f;

위와 같이 했으나 오답 처리를 받았다. 질문을 죽 본 결과 소수 4자리까지 출력하는 것이지, 반올림 하는 것이 아니라 틀린 것을 깨닫게 되었다. 따라서 Math.round를 사용하지 말고 String.format("%.4f", ....)을 사용해야 한다.

 

그리고 이름 순으로 정렬하라고 했는데, HashMap은 정렬 기능이 따로 없다. 그래서 Key들을 Set으로 변경 후 Object Array로 바꾸어 정렬해서 이용했다. 코드가 짧으므로 코드와 함께 보면 이해가 더 쉬울 듯 하다.

(Map -> Set -> Array & sort)

# Code </>

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 void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        HashMap<String, Integer> map = new HashMap<>();

        int size = 0;
        while(true){
            String word = br.readLine();

            if(word == null || word.equals("")) break;

            map.put(word, map.containsKey(word) ? map.get(word) + 1 : 1);
            size++;
        }
        
        Object[] str = map.keySet().toArray();
        Arrays.sort(str);

        for(Object obj:str){
            String key = (String) obj;
            String value = String.format("%.4f", (map.get(key) * 100.0f/ size));

            sb.append(key).append(' ').append(value).append('\n');
        }
        System.out.print(sb);
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 14496번 : 그대, 그머가 되어  (0) 2021.03.28
[백준] 12904번 : A와 B  (0) 2021.03.28
[백준] 14621번 : 나만 안되는 연애  (0) 2021.03.28
[백준] 1062번 : 가르침  (0) 2021.03.28
[백준] 6603번 : 로또  (0) 2021.03.26
Comments