Algorithm/문제풀이 Python

프로그래머스 레벨3 - 카카오 2019 길 찾기 게임

nauni 2021. 1. 19. 08:58

문제주소

programmers.co.kr/learn/courses/30/lessons/42892

내 풀이

# ✨ 파이썬 기본 재귀 limit이 1000이라 늘려주어야 한다! 
import sys
sys.setrecursionlimit(10**6)

class Node:
    def __init__(self, info):
        self.data = info[0]
        self.value = info[1]
        self.left, self.right = None, None

class NodeTree:
    def __init__(self, parent):
        self.parent = parent
    def insert(self, info):
        self.cur_node = self.parent
        while True:
            if info[0][0] < self.cur_node.data[0]:
                if self.cur_node.left != None:
                    self.cur_node = self.cur_node.left
                else:
                    self.cur_node.left = Node(info)
                    break
            else:
                if self.cur_node.right != None:
                    self.cur_node = self.cur_node.right
                else:
                    self.cur_node.right = Node(info)
                    break                 

def solution(nodeinfo):
    answer = [[],[]]
    for i in range(len(nodeinfo)):
        nodeinfo[i] = (nodeinfo[i],i+1)
    nodeinfo.sort(key=lambda x : -x[0][1])
    head = Node(nodeinfo[0])
    tree = NodeTree(head)
    for i in range(1, len(nodeinfo)):
        tree.insert(nodeinfo[i])
    answer[0] = preorder(head, [])
    answer[1] = postorder(head,[])
    return answer

def preorder(node, answer):
    if node == None:
        return answer
    answer.append(node.value)
    preorder(node.left, answer)
    preorder(node.right, answer)
    return answer

def postorder(node, answer):
    if node == None:
        return answer
    postorder(node.left, answer)
    postorder(node.right, answer)
    answer.append(node.value)
    return answer

파이썬에서 재귀로 풀 땐 limit 확인하고 늘려주어야 한다!!!

다른 사람 풀이

거의 트리를 만들어서 푼 사람들이 대다수였던 것 같다. 

정리

이진트리 구현은 처음해본다. 파이썬에서는 이진트리 자료구조를 사용하는 heap 같은 자료구조는 지원해주지만 이진트리 자체는 지원해주진 않아서 구현해야 한다고 한다. 인터넷에서 이진트리 구현을 찾아보면서 작성했다. 전위순회, 후위순회 등의 개념도 처음 알게 되었다. 파이썬에서 class를 처음 사용해보는데 저렇게 쓰면 되는구나 느꼈다. __init__ 이렇게 언더바가 2개 붙은 메소드명은 초기화를 담당하거나 약간 특별한 역할을 해주는 메소드들이다. 뭔가 이진트리에 대한 개념의 이해가 있으면 특별한 제약조건 없이 풀 수 있는 문제라고 느껴졌다.

카카오 문제들이 엄청 조건이 까다롭게 걸리는 문제들이 많아서 힘들었는데, 중간에 이런 문제도 나오는구나 싶었다. 역시 자료구조 공부를 해야한다!!😅 이렇게 트리라는 자료구조를 공부할 수 있어 다행이다!