이 험난한 세상에서어어~

생태학 본문

algorithm/코딩 테스트

생태학

토끼띠NJW 2023. 6. 28. 13:31

문제 설명

나무들이 주어졌을 때, 해당 나무가 전체 나무에서 몇 %를 차지하는지 구하는 문제이다. 이때 출력은 알파벳 순으로 한다. 여기서 주의할 점은 전체 종의 몇 %가 아니라 입력받은 나무의 몇 %인지를 의미하는 것이다.

 

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

 

4358번: 생태학

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

www.acmicpc.net

문제 풀이

첫 번째 접근

문자열 집합과 마찬가지로 trie에 분류되어 있는 문제이다. 근데 굳이 trie로 풀 필요는 없을 거 같은...

 

아무튼 나는 trie로 문제를 풀었다. 

만일 만들어둔 trie 트리에 문자열이 있으면 해당 문자열(딕셔너리) 값을 하나 더해줬고 없으면 새로 추가해줬다. 이때 새로 추가한 문자열의 dic 값은 1로 초기화 했다.

 

그리고 dic 값을 key만 가지고 와서 정렬 한 다음에 정렬한 키 값대로 값을 하나 빼서 백분율을 계산해 소숫점 4자리 수까지 출력해줬다.

코드

import sys

class Trie:
    def __init__(self):
        self.root = {}

    def insert(self, word: str) -> None:
        cur = self.root
        for w in word:
            if w not in cur:
                cur[w] = {}
            cur = cur[w]
        cur['*'] = word

    def findWord(self, word: str) -> bool:
        cur = self.root
        for w in word:
            if w not in cur:
                return False
            cur = cur[w]
        return '*' in cur


trees = {}
t = Trie()
total = 0
while True:
    tree = sys.stdin.readline().rstrip()
    if tree == '':
        break
    total += 1
    if t.findWord(tree):
        trees[tree] += 1
    else:
        t.insert(tree)
        trees[tree] = 1

keyList = list(trees.keys())
keyList.sort()

for k in keyList:
    cal = trees[k]/total * 100
    print("%s %.4f" %(k, cal))

'algorithm > 코딩 테스트' 카테고리의 다른 글

혼자 놀기의 달인, python  (0) 2023.06.29
문자열 지옥에 빠진 호석  (0) 2023.06.28
문자열 집합  (0) 2023.06.28
특정한 최단 경로  (0) 2023.06.26
해킹  (0) 2023.06.26