4358번: 생태학
프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어
www.acmicpc.net
문제
생태학에서 나무의 분포도를 측정하는 것은 중요하다. 그러므로 당신은 미국 전역의 나무들이 주어졌을 때, 각 종이 전체에서 몇 %를 차지하는지 구하는 프로그램을 만들어야 한다.
입력
프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어진다.
출력
주어진 각 종의 이름을 사전순으로 출력하고, 그 종이 차지하는 비율을 백분율로 소수점 4째자리까지 반올림해 함께 출력한다.
코드
import sys
from collections import defaultdict
encyclopedia = defaultdict(int)
total = 0
while True:
try:
species = sys.stdin.readline().strip()
if species == "":
break
encyclopedia[species] += 1
total += 1
except:
break
for t in sorted(encyclopedia.keys()):
print("%s %.4f" %(t, encyclopedia[t]/total * 100))
collections 라이브러리의 defaultdict를 사용하여 풀이하였다.
문제의 풀이는 쉬웠는데 횟수가 정해지지 않은 입력이 끝날 때까지 입력받기와 출력 시 자릿수 문제 때문에 시간이 더 걸렸다...
처음에는 출력할 때 round 함수를 이용하여 4번째 자리에서 반올림하도록 하였더니 틀렸다고 떴었다. 아무리 봐도 맞게 푼 거 같은데 출력에서 문제가 있었나하고 출력문을 위와 같이 고쳤더니 맞았다.
round는 안되는 이유를 찾아보니 round 함수에는 2가지 문제점이 존재하고 있었다.
- 자릿수를 표현해주는 0에 대한 문제
print(round(1.000, 2))
# 1.00이 아닌 1.0이 출력됨
- 0.5에서 반올림 시 짝수 값으로 반올림되는 문제
print(round(1.5)) # 2
print(round(2.5)) # 2
[참고]
Python(파이썬) round 함수 반올림 오류 해결, format 반올림, 0.5 반올림
내가 계속 까먹어서 기록해 놓는 파이썬 소숫점 표현방법! 알고리즘 문제를 풀다보면 대부분 반올림을 써야하는데 익히 알고 있는 round를 쉽게 쓴다. 하지만 round에는 큰 허점이 있어서 다른 방
yangnyang.tistory.com
'문제풀이 > 자료구조' 카테고리의 다른 글
[Python/파이썬] 백준 7662번 이중 우선순위 큐 (0) | 2023.01.30 |
---|---|
[Python/파이썬] 백준 11286번 절댓값 힙 (0) | 2023.01.30 |
[Python/파이썬] 백준 2075번 N번째 큰 수 (0) | 2023.01.30 |
[Python/파이썬] 백준 11279번 최대 힙 (0) | 2023.01.30 |
[Python/파이썬] 백준 14425번 문자열 집합 (0) | 2023.01.30 |