[Python]백준_9733 : 꿀벌

Alal11·2022년 12월 6일
0
post-thumbnail

출처

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


문제

꿀벌이 하는 일은 다음과 같이 분류할 수 있다.

휴식(Re), 순찰(Pt), 방청소(Cc), 꽃가루 먹기(Ea), 새끼 돌보기(Tb), 벌집 짓기와 관리(Cm), 외부 활동(Ex)

한 꿀벌이 1시간 동안 한 일이 주어졌을 때, 각각을 몇 번 했고, 비율이 어떻게 되는지 구하는 프로그램을 작성하시오.


입력

입력은 꿀벌이 한 일이 공백과 줄바꿈으로 구분되어서 주어진다. 최대 24개의 일을 한다.


출력

각각의 일을 한 횟수와 비율을 공백으로 구분하여 출력한다. 출력은 {Re,Pt,Cc,Ea,Tb,Cm,Ex} 순서대로 하며, 비율은 소수점 둘째 자리까지 출력한다. 주어진 목록에 없는 일은 출력하지 않는다.

입력의 마지막 줄에는 "Total 1.00"을 출력하며, 은 꿀벌이 한 일의 개수이다.


예제 입출력


알고리즘 분류

  • 구현
  • 자료 구조
  • 문자열
  • 해시를 사용한 집합과 맵

✍️자료구조 : 해시(Hash)

파이썬에서 해시(Hash)는 딕셔너리 자료구조를 통해서 제공한다.
해시를 언제 사용하면 좋을까?

  1. 리스트를 쓸 수 없을 때
    리스트는 list[1]은 가능하지만 list['a']는 불가능하다.
    인덱스를 이용하여 원소에 접근하는데 인덱스가 숫자가 아닌 문자열, 튜플 등을 사용하려고 할 때 딕셔너리를 사용하면 좋다.

  2. 빠른 접근과 탐색이 필요할 때
    리스트에 비해 딕셔너리 함수의 시간복잡도는 대부분 O(1)이므로 아주 빠른 자료구조이다.
    원소를 넣거나 삭제 또는 찾는 일이 많을 때에는 딕셔너리를 사용하는 것이 좋다.

  3. 집계가 필요할 때
    원소의 개수를 세는 코딩 문제가 있을 때, 해시와 collections 모듈의 Counter 클래스를 사용하면 아주 빠르게 문제를 풀 수 있다.


➡️문제 분석

꿀벌이 한 일을 인덱스로 이용하여 원소에 접근하는 방법을 이용하기 위해 딕셔너리를 사용해본다.


➡️코드(⭕)

import sys

work = ['Re', 'Pt', 'Cc', 'Ea', 'Tb', 'Cm', 'Ex']       # 꿀벌이 하는 일 리스트에 담기

bee = dict()        # dict() 함수 호출로 빈 딕셔너리 선언, bee = {}도 같은 기능
for i in work:
    bee[i] = 0      # work의 각 요소들을 키 값으로 하는 bee 딕셔너리 밸류값을 0으로 초기화

cnt = 0
line = sys.stdin.readlines()

for i in line:
    str = list(i.split())      # 입력받은 값을 리스트 형태로 str에 넣음 
    
    for j in str:
        if j in work:
            bee[j] = bee.get(j, 0)+1
        cnt += 1

for i in bee:
    print(i, bee.get(i), '{:.2f}'.format(bee.get(i)/cnt))

print('Total', cnt, '1.00')

➡️코드 분석

  1. 꿀벌이 하는 일을 work 리스트에 담고, 빈 딕셔너리 bee를 생성해준다.

  2. work의 각 요소들을 키 값으로 하는 bee 딕셔너리 밸류값을 0으로 초기화 해준다.

  3. 값을 빠른 입력으로 받고, 공백으로 구분하여 리스트 형태로 str에 넣어준다.

  4. str의 각 요소들을 j에 넣어서 반복해주는데 만약, j가 work 안에 있다면 j를 키 값으로 하는 밸류값에 +1을 해주고 cnt+1을 해준다.

  5. bee의 키 값을 i에 넣고 반복해준다. 키 값과 밸류값과 밸류값을 cnt로 나눈 몫을 출력해준다.

bee[키 값] = 밸류값 --> bee 딕셔너리에 해당 키 값과 밸류값이 각각 생성된다.
bee.get(키 값) == 밸류값
bee.get(키 값, 0) == 키 값이 딕셔너리 안에 없는 값이면 0을 반환함


➡️end

딕셔너리.. 자주 쓰면 유용하게 쓸 수 있을 것 같은데 아직까진 최대한 리스트로 해결하고 싶은 마음ㅠ_ㅠ

0개의 댓글