문자열을 이용해 트리를 만드는 것이 쉽지 않았다. 입력된 경로를 통해 중복으로 자식 노드를 만들지 않기 위해서 dictionary를 이용해야했는데 여러 겹으로 중첩된 dictionary를 만드는 것을 지금까지 문제를 풀면서 시도해본 적이 많이 없기 때문에 어려웠다.
문자열을 이용한 트리 구조를 찾아보았고 Trie 자료구조가 있다는 것을 알게되었다.
문자열을 저장하고 효율적으로 탐색하기 위한 트리 자료구조. 자동완성, 사전에서 찾기, 문자열 검사에 사용된다.
import sys
def input(): return sys.stdin.readline().rstrip()
class Node:
def __init__(self, key):
self.key = key
self.children = {}
class Trie:
def __init__(self):
self.head = Node(None)
def insert(self, string):
curr_node = self.head
for c in string:
if c not in curr_node.children:
curr_node.children[c] = Node(c)
curr_node = curr_node.children[c]
def print_node(now:Node, i:int, isHead=False):
'''
문제에서 요구하는 형식으로 출력하는 함수
'''
if not isHead:
print("--"*i + now.key)
sorted_keys = sorted(now.children.keys())
for child in sorted_keys:
print_node(now.children[child], i+1)
n = int(input())
trie = Trie()
for _ in range(n):
path = input().split()[1:]
trie.insert(path)
print_node(trie.head,-1,True)