본문 바로가기

백준

백준 4358 생태학 (파이썬)

https://www.acmicpc.net/problem/4358

 

4358번: 생태학

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

www.acmicpc.net

문제

풀이

dictionary를 알고 있다면 쉽게 풀리는 문제이다. 

입력값으로 주어지는 나무들에 대해서 dictionary에 이미 있는지 검사하고 만약 있다면 해당 나무의 값을 +1하고 없다면 dictionary에 값을 넣으면서 기본값을 1로 잡아주면 된다. 

풀이도 간단하고 시간복잡도 역시 높지 않으며 문제풀이의 로직 역시 다른 사람들과 동일했다. 그러나 시간초과가 발목을 잡았다.

조금더 찾아보니 그냥 입력을 받는 input은 시간을 조금더 잡아 먹는다고 한다. 그렇기에 sys모듈을 import하고 해당 모듈안에 존재하는 stdin.readline을 사용해야 한다.

코드

import sys
input = sys.stdin.readline

def sol():
    D = dict()
    NumberOfTree = 0
    while True:
        Tree = input().rstrip()
        if not Tree:
            break

        if Tree in D:
            D[Tree] += 1
        else:
            D[Tree] = 1
        NumberOfTree += 1

    Datas = list(D.keys())
    Datas.sort()

    for Data in Datas:
        print('%s %.4f' %(Data, D[Data]/NumberOfTree*100))

sol()