백준 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 처리가 필요하다는 점이다.
전체 전략
- 각 나무 이름을 딕셔너리로 카운팅하고
- 전체 나무 수를 누적한 뒤
- 사전순으로 정렬하여 비율을 계산해 출력한다.
입력 처리(EFO)에서의 주의점
이 문제는 입력의 끝이 명시되지 않으므로, input()이 빈 문자열(‘‘)을 반환하는 순간을 EOF로 판단해 반복을 종료해야 한다. 또한 입력은 한 줄에 하나의 나무 이름으로 들어오므로, 줄바꿈 문자가 함께 포함된다. 이를 제거하지 않으면 딕셔너리의 key로 사용될 때 동일한 나무가 서로 다른 문자열로 인식될 수 있다. 따라서 입력을 받을 때 rstrip()으로 개행 문자를 제거하는 것이 필수다.
구현하면서 겪은 실수
가장 큰 실수는 전체 나무 개수를 누적하지 않고 매번 1로 덮어쓴 것이었다. 이로 인해 모든 비율이 잘못 계산되었다. 또한 입력 문자열에서 개행 문자를 제거하지 않아, 출력 결과가 이상해질 수 있다는 점도 중요한 교훈이었다. 이 문제는 알고리즘보다 입력과 상태 관리의 정확성이 훨씬 중요한 문제였다.