Today Sangmin Learned
728x90

1. 링크

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

2. 난이도(solved.ac 참고)

골드5

3. 풀이

 

import sys
from collections import defaultdict
f = sys.stdin.readline
count = 0
result = defaultdict(int)
while True:
a = f().rstrip()
if not a:
break
result[a] += 1
count += 1
result = sorted(result.items())
for i in result:
print("%s %.4f" % (i[0], i[1]*100/count))
view raw 생태학.py hosted with ❤ by GitHub

 

딕셔너리로 구했는데 자꾸 시간 초과가 떠서 defaultdict를 사용해서 풀었다. 처음에는 try except로 하려고 했는데 생각해보니까 input값에서 공백을 제거한 값이 아무것도 없으면 더이상 진행하지 않으면 되는 것이었다.

 

defaultdict(int)를 주게 될 경우, 값을 부여했을 때 숫자 형태로 저장이 된다. 아래 예시를 보면 이해가 될 것이다.

<python />
from collections import defaultdict a = defaultdict(int) b = defaultdict(list) c = input() a[c] += 1 b[c] = ['steadily', 'worked'] print(a) print(b) # input값을 3으로 줬을 경우 # defaultdict(<class 'int'>, {'3': 1}) # defaultdict(<class 'list'>, {'3': ['steadily', 'worked']})

input값은 무엇이든 들어갈 수 있고 그에 해당하는 values, 즉 숫자가 +1이 되는 것이다. 이 숫자가 바로 defaultdict의 속성을 int로 지정해줬을 때에 가능한 것이다. list로 설정한다면 values는 list 형태가 된다. 물론 넣어주는 값도 지정한 속성에 따라야 한다.

count는 전체 개수를 구하기 위해 매 while문을 돌때마다 더해준다.

 

이 defaultdict를 사용하면 각 input값에 대한 빈도를 아주 쉽게 구할 수 있다. result[a] += 1을 통해 input으로 넣은 단어들에 대한 카운트가 1씩 증가하게 된다. 이제 result는 {key:value}의 형태로 되어있을 것이므로 result를 도는 반복문에서 key에 해당하는 문자열과 value에 해당하는 횟수 * 100을(%로 표현하라고 했으므로) 위에서 구한 count로 나눠주면 된다.

profile

Today Sangmin Learned

@steadily-worked

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!