Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 브루트포스
- 해시 테이블
- 세그먼트 트리
- DP
- Python
- 에라토스테네스의 체
- 문자열
- 플로이드-워셜
- 그래프
- 정렬
- 모던 JavaScript 튜토리얼
- JavaScript
- 싸피
- 13164
- 그리디
- 애드 혹
- 맵
- 슬라이딩 윈도우
- 트리
- boj
- BFS
- 투 포인터
- 누적 합
- 구현
- 2357
- SSAFY
- 수학
- 이분 탐색
- 정수론
- DFS
Archives
- Today
- Total
흙금이네 블로그
[BOJ] 5670 - 휴대폰 자판 (Python) 본문
아이디어
트라이를 이용하여 단어들의 공통 부분을 확인한다.
풀이
테스트 케이스 수가 입력으로 주어지지 않으므로 try except문으로 입력이 주어지는 동안 while문을 반복한다.
클래스로 구현한 트라이 trie를 생성하여 insert로 단어들을 트라이에 넣고, search로 결과값 res에 입력 횟수를 더한다.
트라이 객체 생성 시 루트 노드를 가리키는 root에 빈 딕셔너리를 할당한다.
insert 메서드는 단어의 문자들이 루트 노드에서부터 차례로 자식 노드로 존재하지 않으면 자식 노드를 새로 생성하고,
단어가 끝나는 지점에서는 별 문자를 키로 빈 딕셔너리를 저장한다.
search 메서드는 문자의 문자들을 루트 노드에서부터 차례로 찾고, 유일한 문자가 아니면 입력 횟수 cnt를 1 증가시킨다.
결과값 res를 N으로 나눈 평균을 f-string으로 소수점 둘째 자리에서 반올림하여 출력한다.
import sys
input = sys.stdin.readline
class Trie:
def __init__(self):
self.root = dict()
def insert(self, S):
node = self.root
for c in S:
if c not in node:
node[c] = dict()
node = node[c]
node['*'] = dict()
def search(self, S):
node = self.root[S[0]]
cnt = 1
for c in S[1:]:
if len(node) > 1:
cnt += 1
node = node[c]
return cnt
while 1:
try:
N = int(input())
trie = Trie()
words = [input().rstrip() for _ in range(N)]
res = 0
for i in range(N):
trie.insert(words[i])
for i in range(N):
res += trie.search(words[i])
print(f'{(res/N):0.2f}')
except:
break
'알고리즘' 카테고리의 다른 글
[BOJ] 2748 - 피보나치 수 2 (Python, JavaScript) (0) | 2023.02.20 |
---|---|
[BOJ] 6549 - 히스토그램에서 가장 큰 직사각형 (Python) (0) | 2023.02.19 |
[BOJ] 14426 - 접두사 찾기 (Python) (0) | 2023.02.18 |
[BOJ] 11505 - 구간 곱 구하기 (Python) (0) | 2023.02.17 |
[BOJ] 19598 - 최소 회의실 개수 (Python, JavaScript) (0) | 2023.02.17 |
Comments