길 찾기 게임

210714

'''
https://programmers.co.kr/learn/courses/30/lessons/42892
길 찾기 게임
[풀이]
0. 이진트리 구현 및 탐색
1. 클래스로 이진트리 구현
=> 여기서는 idx와 val값 두개를 가지고 있는 것이 차이점
2. 재귀 제한을 풀지 않으면 5, 6번 문제에서 런타임 에러
3. nodeinfo에서 idx값을 알 수 있도록 추가
4. 주어진 nodeinfo를 y 값에 대해 내림차순 정렬
=> 깊이가 낮은 순으로 트리에 쌓이게 함
=> 트리는 입력 순서에 따라 내용이 달라지기 때문에 깊이 순으로 정렬
'''
class Node:
    def __init__(self, val, idx):
        self.val = val
        self.idx = idx
        self.left = None
        self.right = None

class Tree:
    def __init__(self, root):
        self.root = root

    def insert(self, val, idx):
        cur_node = self.root
        while True:
            if cur_node.val < val:
                if cur_node.right != None:
                    cur_node = cur_node.right
                    continue
                else:
                    cur_node.right = Node(val, idx)
                    break
            else:
                if cur_node.left != None:
                    cur_node = cur_node.left
                    continue
                else:
                    cur_node.left = Node(val, idx)
                    break

    def preorder(self, cur_node):
        if cur_node == None:
            return []
        return [cur_node.idx] + self.preorder(cur_node.left) + self.preorder(cur_node.right)

    def postorder(self, cur_node):
        if cur_node == None:
            return []
        return self.postorder(cur_node.left) + self.postorder(cur_node.right) + [cur_node.idx]


def solution(nodeinfo):
    import sys
    sys.setrecursionlimit(10 ** 6)

    nodes = [[idx] + info for idx, info in enumerate(nodeinfo, 1)]
    nodes.sort(key=lambda x: x[2], reverse=True)

    root = Node(nodes[0][1], nodes[0][0])
    tree = Tree(root)

    for node in nodes[1:]:
        tree.insert(node[1], node[0])

    return [tree.preorder(root), tree.postorder(root)]


'''
클래스로 풀어보는 첫 문제.
구현이 번거롭지만 구현하고 나니 풀기는 쉬웠다.
'''

Last updated

Was this helpful?