코딩테스트/자바 문제풀이

[자료구조2] 백준 4358 생태학

승요나라 2024. 7. 22. 21:31

4358번: 생태학

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

 

# 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        // 빠른 입출력을 위한 BufferedReader 와 StringBuilder
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 나무의 종류와 개수를 기록할 Map
        Map<String, Double> tree = new HashMap<>();

        // 나무의 전체 개수 (= 테스트케이스의 수)
        long t = 0;

        // input 선언만 밖에서 함
        String input;

        // 입력줄이 존재하는 동안 계속 반복
        while ((input = br.readLine()) != null) {
            // Map에 이미 종이 있다면 개수를 1 증가시키고, 없다면 개수를 0 + 1로 하여 Map에 추가
            tree.put(input, tree.getOrDefault(input, 0.0) + 1);

            t++;
        }

        // ArrayList를 활용해 Key 값을 기준으로 오름차순 정렬
        List<String> keySet_tree = new ArrayList<>(tree.keySet());
        Collections.sort(keySet_tree);

        // 정렬된 순서로 비율을 계산해 StringBuilder 에 쌓기
        for (String key : keySet_tree) {
            // 해당 종이 차지하는 비율 (소수점 4째자리까지 반올림)
            String per = String.format("%.4f", tree.get(key)/t * 100);

            // StringBuilder에 쌓기
            sb.append(key).append(" ").append(per).append("\n");
        }

        System.out.println(sb);

        // Reader 버퍼 닫기
        br.close();
    }
}
  • Map 을 이용해 나무의 종류와 개수를 묶어 관리한다.
  • map.getOrDefault(key, defaultValue) : Map에서 key에 대한 value를 가져오거나, 해당 key가 존재하지 않는다면 디폴트로 value 값을 지정하는 메소드
  • Map에서 Key 값을 기준으로 정렬할 때는 map.keySet() 으로 키셋을 가져와 ArrayList 에 넣어서 Collections.sort() 를 사용해 정렬한다. 내림차순은 Collections.reverse() 를 사용하면 된다.
  • 소수점 4째자리까지 반올림은 String.format("%.nf", x) 형식으로 스트링 포맷을 사용한다.

 

처음에는 아래와 같이 if-else 문으로 코드를 작성하였으나, 상위권으로 제출하신 분의 코드를 보고 map.getOrDefault() 메소드를 참고하게 되었다.

내가 딱 하고 싶었던 로직이 정확히 메소드로 존재하다니ㅎ

참 좋은 세상이다.

// 입력줄이 존재하는 동안 계속 반복
while ((input = br.readLine()) != null) {
    // Map에 나무 종이 이미 존재한다면 개수 증가
    if (tree.containsKey(input)) {
        tree.replace(input, tree.get(input) + 1);
    } else {
        // 처음 등록되는 나무 종이라면 개수를 1로 하여 Map에 추가
        tree.put(input, 1.0);
    }

    t++;
}