https://www.acmicpc.net/problem/4358
4358번: 생태학
프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어
www.acmicpc.net
1. 해결방법
파이썬 딕셔너리를 활용해서 해결하는 방법이 가장 적절하다.
1. while문으로 나무의 종을 입력받고, 그것을 딕셔너리에 저장한다.
2. 저장할 때, 입력받은 나무가 이미 딕셔너리에 있다면? => 해당 나무의 value를 + 1 한다.
3. 시간복잡도를 고려해서 while 문 안에 나무를 입력받으면서 idx 총 개수를 카운팅한다.
4. 알파벳 순으로 정렬.
5. 정렬한 딕셔너리를 for문으로 이름과 비율을 출력한다.
여기서 주의해야될 점은 비율은 소수점 4번째 자리까지 반올림 해야한다.
round(?, 4) 메서드를 사용했더니 자꾸 틀렸다고 나오는데, 그 이유는 float와의 정확도가 다르기 때문이다.
예 들어, round(2.675, 2)는 2.68 대신에 2.67 을 제공한다. 이것은 버그가 아니다. 대부분의 십진 소수가 float로 정확히 표현될 수 없다는 사실로부터 오는 결과이기 때문,,,,
2. 정답코드
import sys
input = sys.stdin.readline
trees = {}
idx = 0
while True:
tree = input().strip()
if not tree:
break
if tree in trees.keys():
trees[tree] += 1
else:
trees[tree] = 1
idx += 1
sort_dict = dict(sorted(trees.items()))
for item in sort_dict.items():
print(f'{item[0]} {(item[1] / idx * 100):.4f}')
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 11660. 구간 합 구하기5 Python, Java (0) | 2023.02.09 |
---|---|
[BOJ] 16987. 계란으로 계란치기 Python (0) | 2023.02.07 |
[BOJ] 2075. N번째 큰 수 Python (0) | 2023.02.05 |
[BOJ] 11279. 최대 힙 Python, Java (0) | 2023.02.03 |
[BOJ] 1620. 나는야 포켓몬 마스터 이다솜 Python, Java (0) | 2023.02.03 |