Open robert-min opened 1 year ago
from collections import defaultdict
import sys
sys.setrecursionlimit(10**9)
class TrieNode:
def __init__(self, key, data=None):
self.key = key # 값으로 입력될 분자
self.data = data # 문자열의 종료를 알리는 flag
self.children = defaultdict(TrieNode) # 자식 노드를 저장
self.n = 0 # 해당 노드가 방문한 횟수
# 해당 노드를 방문한 횟수 n 저장
def finalize(self):
self.n = 1 if self.data else 0
for char, node in self.children.items():
self.n += node.finalize()
return self.n
class Trie:
def __init__(self):
self.root = TrieNode(None)
def insert(self, word):
cur_node = self.root
for char in word:
if char not in cur_node.children:
cur_node.children[char] = TrieNode(char)
cur_node = cur_node.children[char]
cur_node.data = word
# 해당 노드를 방문한 횟수 n 저장
def finalize(self):
self.root.finalize()
def search(self, word):
depth = 0
cur_node = self.root
# 문자 하나씩 확인
for char in word:
if char in cur_node.children:
cur_node = cur_node.children[char]
depth += 1
# 한번만 방문했다는 뜻은 해당 문자는 다른 문자에는 없는 단어로 찾으려는 값
if cur_node.n == 1:
break
return depth
def solution(words):
"""
Return : 몇 개의 문자를 입력하면 되는지
Params : words
"""
answer = 0
trie = Trie()
for w in words:
trie.insert(w)
# 트라이 노드의 방문 횟수 저장
trie.finalize()
for w in words:
answer += trie.search(w)
return answer
풀이
def solution(cookie):
"""
Return : 한 명의 아들에게 줄 수 있는 가장 많은 과자 수, 없으면 0
""" answer = 0 N = len(cookie)
for i in range(N-1): left_sum, left_idx = cookie[i], i right_sum, right_idx = cookie[i+1], i+1
while True:
# 최댓값 갱신
if left_sum == right_sum:
answer = max(answer, left_sum)
# 큰애가 작은애보다 더 적을 경우 쿠키를 더 준다.
if left_idx > 0 and left_sum <= right_sum:
left_idx -= 1
left_sum += cookie[left_idx]
# 작은애가 큰애보다 더 적을 경우 쿠키를 더준다.
elif right_idx < N-1 and right_sum <= left_sum:
right_idx += 1
right_sum += cookie[right_idx]
# 쿠키를 줄 수 없을 경우 종료
else:
break
return answer
def solution(cookie):
"""
Return : 한 명의 아들에게 줄 수 있는 가장 많은 과자 수, 없으면 0
- i ~ m = m+1, r
"""
answer = 0
N = len(cookie)
for left in range(N-1):
right = left + 1
# left
sum_l = sum(cookie[:left+1])
L_list = [sum_l]
for i in range(left):
sum_l -= cookie[i]
L_list.append(sum_l)
# right
sum_r = sum(cookie[right:N])
R_list = [sum_r]
for j in range(N-1, right, -1):
sum_r -= cookie[j]
R_list.append(sum_r)
if len(L_list) < len(R_list):
for l in L_list:
if l in R_list:
answer = max(answer, l)
else:
for r in R_list:
if r in L_list:
answer = max(answer, r)
return answer
Trie 기본 구현
Trie Node
Trie 구현
starts_with 함수 : prefix 단어로 시작하는 단어를 찾고 배열로 리턴하는 함수