본문 바로가기
Algorithms/백준

[백준_4358]생태학 with Python

by jeomn 2021. 6. 24.

백준(BOJ) 문자열 문제집: 생태학(골드 5)

문제 출처: https://www.acmicpc.net/problem/4358

 

4358번: 생태학

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

www.acmicpc.net

1. 알고리즘

dictionary 자료형 사용하면 쉬운 문제. 각 나무 이름을 key, 나온 횟수(갯수)를 value로 세어 주고 나중에 평균 출력만 해주면 된다. 다만 데이터 입력 받는 부분 때문에 좀 고심했음.

  • 한줄씩 입력받아 오른쪽 공백 제거
    • 나무 dictionary에 나무 이름을 key, 횟수 카운팅을 value로 데이터 삽입
    • 전체 나무 갯수 카운팅
  • 나무 이름 기준 사전 순 정렬된 데이터에 대해 비율 계산 후 f-string으로 소숫점 4째자리 까지 출력

 

 

2. 유의사항

  • 주어지는 나무의 갯수는 주어지지 않음. 나무 데이터 입력의 끝은 개행 문자로 확인해주면 됨.

 

3. 어려웠던 점, 해결 방법

  • 파이썬 EOF가 공백이라 어떻게 구별해야할 지 고민했었음.
    • #틀린 코드
      #입력 끝이 공백이니까 값이 없을 때 종료하도록 했었음
      while True:
          input_tree = list(map(str, input_func().split()))
          if not input_tree:
              break
    • 입력 데이터 종료를 표현하기 위한 개행 문자가 있어서 '\n'로 구분함

 

4. 소스코드

상세 코드 설명은 주석 참고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import sys
from collections import defaultdict
 
if __name__ == '__main__':
    tree_dict = defaultdict(int)    #나무 딕셔너리
    tree_count = 0      #전체 나무 갯수
    #데이터 입력 반복
    for input_line in sys.stdin:
        #개행 문자가 입력되는 경우 = 입력 끝
        if input_line == '\n':
            break
            
        input_tree = input_line.rstrip()    #공백 문자 제거
        tree_dict[input_tree] += 1      #딕셔너리 데이터 삽입
        tree_count += 1     #전체 나무 갯수 카운팅
    
    #나무 딕셔너리 키 값에 대해 정렬된 순서대로 반복
    for tree, count in sorted(tree_dict.items()):
        ratio = (count/tree_count)*100      #비율 계산
        print(f'{tree} {ratio:.4f}')        #f-string으로 '나무 이름 비율' 출력
cs

 

5. 고민

  • f-string 너무 간편...좋더라

댓글