Problem Solving/백준

[BOJ 백준] 4358번 : 생태학(Python, 파이썬)

돌돌김 2021. 1. 24. 04:22

4358번: 생태학 (acmicpc.net)

 

4358번: 생태학

프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어

www.acmicpc.net

 

문제는 골드 4였지만, 딕셔너리를 사용하면 쉽게 풀리는 문제다. 단순한 딕셔너리가 아니라, defaultdict를 썼다면 if, else 분기를 안해도 됐을 것이다.

 

주의해야할 부분은 다음과 같다.

  • 입력
  • 소숫점 넷째짜리까지 계산
  • 소숫점 넷째짜리까지 출력

 

우선 입력이 밑도 끝도 없이 들어와서 밑도 끝도 없이 끝난다. 들어오는 나무의 개수라도 알려주면 좋겠지만 그딴게 없다. 더 이상 입력이 들어오지 않을 때 까지 계속 받아야 한다. 백준 문제 중 간혹이런게 있다..

굳이 이걸 어떻게 할지 고민하지말고, 이런 건 그냥 다른 사람의 풀이를 보며 입력 부분만 확인하자. 

그래도 이게 뭔지 키워드는 알고 가면 좋다.

  • EOF

 

다음으로 문제에서 요구사항인 소숫점 넷째짜리 까지 계산은 파이썬 내장함수인 round를 사용하면 쉽게 해결 가능하다. 또한, 백분율로 나타내야하므로 100을 곱해주자.

 

그리고, 이런식으로만 하면 "50" 과 같은 숫자는 50.00 이렇게 끝난다. 소숫점 넷째 자리까지 출력해야하므로 "50.0000" 이렇게 출력해야한다. 

 

이것은 '%' 를 사용해서 해결할 수 있다. 예를들어 소숫점 넷째자리 까지 출력하려면 아래와 같이 하면 된다 

  • '%.4f' %value 

 

 

소스코드

 

import sys

trees = {}
tree_num = 0 

for line in sys.stdin:
    if line == '\n':
        break
    tree = line.rstrip()
    tree_num += 1
    if tree in trees:
        trees[tree] += 1
    else:
        trees[tree] = 1

sorted_trees = sorted(trees.items(), key=lambda x:x[0])


for k, v in sorted_trees:
    percentage = round((v/tree_num)*100, 4)
    print(k, '%.4f' %percentage)