반응형
백준 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 확인
- 끝 값(EOFf)를 알아내는 법
- 소수점 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;
}
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 14675] 단절점과 단절선 (JAVA) (0) | 2023.09.19 |
---|---|
[백준 7662] 이중 우선순위 큐 (JAVA) (0) | 2023.09.19 |
[백준 1516] 게임 개발 (JAVA) (0) | 2023.08.29 |
[백준 2252] 줄 세우기 (JAVA) (1) | 2023.08.27 |
[백준 1043] 거짓말 (JAVA) (1) | 2023.08.27 |