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)) |
딕셔너리로 구했는데 자꾸 시간 초과가 떠서 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로 나눠주면 된다.
'CS > 알고리즘' 카테고리의 다른 글
[Python] BOJ(백준) 5052번 - 전화번호 목록 (0) | 2021.08.30 |
---|---|
[Python] BOJ(백준) 12904번 - A와 B (0) | 2021.08.30 |
[Python] BOJ(백준) 15654번 - N과 M(5) (0) | 2021.08.28 |
[PyPy3] BOJ(백준) 17626번 - Four Squares (0) | 2021.08.26 |
[Python] BOJ(백준) 1013번 - Contact (0) | 2021.08.25 |