2022년 12월 6일에 작성됨
https://www.acmicpc.net/problem/9733
9733번: 꿀벌
각각의 일을 한 횟수와 비율을 공백으로 구분하여 출력한다. 출력은 {Re,Pt,Cc,Ea,Tb,Cm,Ex} 순서대로 하며, 비율은 소수점 둘째 자리까지 출력한다. 주어진 목록에 없는 일은 출력하지 않는다. 입력의
www.acmicpc.net
✍️자료구조 : 해시(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
딕셔너리.. 자주 쓰면 유용하게 쓸 수 있을 것 같은데 아직까진 최대한 리스트로 해결하고 싶은 마음ㅠ_ㅠ
'코딩테스트 & 문제 풀이' 카테고리의 다른 글
[Python]백준_14425 : 문자열 집합 (0) | 2023.11.04 |
---|---|
[Python]백준_1269 : 대칭 차집합 (2) | 2023.11.04 |
[C]백준_2193 : 이친수 (4) | 2023.11.02 |
[C]백준_13699 : 점화식 (1) | 2023.11.01 |
[C]백준_9625 : BABBA (0) | 2023.11.01 |