백준 4358번 - 생태학

생태학 문제 바로 가기

풀이 날짜: 2026-01-20

baekjoon 알고리즘 문제 풀이

풀이 코드


import sys
import sys
input = sys.stdin.readline

names = {}
tree_count = 0

while True:
    tree = input().rstrip()
    if not tree:
        break
    if tree in names:
        names[tree] += 1
    else:
        names[tree] = 1
    tree_count += 1

trees = list(names.keys())
trees.sort()

for i in trees:
    print("%s %.4f" %(i, names[i]/tree_count * 100))
  

문제 접근

이 문제는 입력으로 주어지는 나무 이름들을 끝(EOF)까지 읽어 들여, 각 나무 종이 전체에서 차지하는 비율(%)을 소수점 넷째 자리까지 출력하는 문제다. 핵심은 입력의 개수가 사전에 주어지지 않으며, EOF 처리가 필요하다는 점이다.


전체 전략

  1. 각 나무 이름을 딕셔너리로 카운팅하고
  2. 전체 나무 수를 누적한 뒤
  3. 사전순으로 정렬하여 비율을 계산해 출력한다.

입력 처리(EFO)에서의 주의점

이 문제는 입력의 끝이 명시되지 않으므로, input()이 빈 문자열(‘‘)을 반환하는 순간을 EOF로 판단해 반복을 종료해야 한다. 또한 입력은 한 줄에 하나의 나무 이름으로 들어오므로, 줄바꿈 문자가 함께 포함된다. 이를 제거하지 않으면 딕셔너리의 key로 사용될 때 동일한 나무가 서로 다른 문자열로 인식될 수 있다. 따라서 입력을 받을 때 rstrip()으로 개행 문자를 제거하는 것이 필수다.


구현하면서 겪은 실수

가장 큰 실수는 전체 나무 개수를 누적하지 않고 매번 1로 덮어쓴 것이었다. 이로 인해 모든 비율이 잘못 계산되었다. 또한 입력 문자열에서 개행 문자를 제거하지 않아, 출력 결과가 이상해질 수 있다는 점도 중요한 교훈이었다. 이 문제는 알고리즘보다 입력과 상태 관리의 정확성이 훨씬 중요한 문제였다.