본문 바로가기

CodingTEST

[백준 4358] 생태학 (JAVA)

반응형

백준 4358번 문제 - 생태학

 

4358번: 생태학

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

www.acmicpc.net


문제 분석

 

  • 나무들을 입력이 없을 때까지 입력받아, 각 나무별로 차지하는 비율(%)을 소수점 4째자리까지 출력해라

해결 키 포인트

 

  • 입력받을 수 N을 입력받지 않고, 어떻게 사용자의 입력 종료를 기다릴지가 중요
    • 끝 값(EOFf)를 알아내는 법
      1) (Scanner 사용) scanner.hasNextLine()과 입력받은 문자열 s의 s.isEmpty() 확인
      2) (BufferedReader 사용) 입력받은 문자열 s의 s.isEmpty()s != null 확인
  • 소수점 4째자리까지 출력
    1) String.format("%.4f", num) 사용
    2) System.out.printf("%.4f", num) 사용
  • 필자는 사용 안했지만, Map을 사용하면 더 쉽게 풀 수 있다

 

 

코드

 

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String [] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        Scanner sc = new Scanner(System.in);

        ArrayList<String> input = new ArrayList<>();

        // 입력 (문자열 입력의 끝을 알아내는 법을 몰라 찾아봄 -> sc.hasNextLine())
        while(sc.hasNextLine()) {
            String s = sc.nextLine();

            // 입력이 없을 경우 break
            if(s.isEmpty()) break;

            input.add(s);
        }

        // 정렬
        Collections.sort(input);

        // 나무 종류별로 수 세기
        ArrayList<Tree> trees = new ArrayList<>();
        trees.add(new Tree(input.get(0)));
        for(int j=1;j<input.size();j++) {
            if(input.get(j-1).equals(input.get(j))) {
                trees.get(trees.size()-1).count++;
            }
            else {
                trees.add(new Tree(input.get(j)));
            }
        }

        // 출력
        int N = input.size();
        for(int j=0;j<trees.size();j++) {
            Tree tree = trees.get(j);
            // 4번째 소수점 까지 출력 (String.format( ,,, ) 이용
            bw.write(tree.name + String.format(" %.4f", tree.getAvg(N)) +"\n");
        }
        bw.flush();
        bw.close();

    }

    public static class Tree {
        public double count = 1;
        public String name;
        public Tree(String name) {
            this.name = name;
        }

        // 평균 알아내기
        public double getAvg(int N) {
            return count / N * 100.0;
        }
    }
}

 

반응형