import sys


class Node():
    def __init__(self,key=None,data=None):
        self.key = key
        self.data = data
        self.depth = 0
        self.child_node = {}
class Trie():
    def __init__(self):
        self.rootnode = Node()
    
    def insert(self,arr):
        cur_node = self.rootnode

        for node in arr:
            if node not in cur_node.child_node.keys():
                cur_node.child_node[node] = Node(node)
            cur_node.child_node[node].depth = cur_node.depth+1
            cur_node = cur_node.child_node[node]
        cur_node.data = 'END'
    def print(self):
        cur_node = self.rootnode
        stack = sorted(cur_node.child_node.values(),key= lambda x : (x.key),reverse=True)
        result = ''
        while stack:
            node = stack.pop()

            current_depth = node.depth
            result = '--'*(current_depth-1)+node.key
            print(result)
            if node.data == None:
                child_node = sorted(node.child_node.values(),key= lambda x : (x.key),reverse=True)
                stack.extend(child_node)

input = sys.stdin.readline
N = int(input())
trie = Trie()
for _ in range(N):
    N,*arr = input().split()
    N = int(N)
    trie.insert(arr)

trie.print()

트라이 알고리즘 문제를  처음 풀어본 유형이었다.

 

그래서 풀기 어려웠고, trie를 공부한 뒤에 풀 수 있었다.

 

이 문제는 전형적인 트라이 알고리즘으로, 현재 노드의 자식노드들을 저장하고,

 

자식노드에 해당 값이 있으면, 넘어가고, 없는 새로운 값이면 child_node에 Node를 추가시켜주면 된다.

 

그리고 print 또한 반복문적으로 끝까지 반복해서 들어가면 된다.

 

그런 방식으로 풀어주면 되는 문제였고, 좀 더 간단하게 풀어주기 위해, 해당 depth를 저장시켜주었다.

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ/백준] 15663 N과 M(9)  (0) 2021.06.06
[BOJ/백준] 14950 정복자  (0) 2021.06.06
[BOJ/백준] 12852 1로 만들기 2  (0) 2021.06.06
[BOJ/백준] 12764 싸지방에 간 준하  (0) 2021.06.06
[BOJ/백준] 11085 군사이동  (3) 2021.06.06

+ Recent posts