풀이 과정
- 트리를 만들어주어야 하는 문제이므로 트리를 구성할 노드 class 정의
- 모든 노드에 인덱스 달아준 다음, 모든 노드의 좌표를 y 좌표 기준 내림차순으로 정렬
- 가장 y좌표가 큰 케이스를 루트 노드로 지정
- 이제 y좌표 순으로 트리에 삽입
- 삽입하려는 노드의 x좌표가 현재 노드의 x좌표보다 작다면 왼쪽 이동
- 삽입하려는 노드의 x좌표가 현재 노드의 x좌표보다 크다면 오른쪽 이동
- 이동 하다가 현재 노드의 left/right가 None이라면 삽입
- 전위순회 / 후위순회를 recursion으로 구현
트리 만드는거 연습이 필요함.. 어렵게 구현
소스 코드
import sys
sys.setrecursionlimit(10**6)
class tree:
def __init__(self, element):
self.left = None
self.right = None
self.element = element
def tree_push(root, node):
# X좌표 비교
if root == None:
root = node
if root.element[0] > node.element[0]:
if root.left == None:
root.left = node
else:
tree_push(root.left, node)
elif root.element[0] < node.element[0]:
if root.right == None:
root.right = node
else:
tree_push(root.right, node)
def preorder(node, answer):
if node == None:
return
answer.append(node.element[2])
preorder(node.left, answer)
preorder(node.right, answer)
def postorder(node, answer):
if node == None:
return
postorder(node.left, answer)
postorder(node.right, answer)
answer.append(node.element[2])
def solution(nodeinfo):
answer = [[], []]
for idx, node in enumerate(nodeinfo):
node.append(idx+1)
nodeinfo.sort(key=lambda x:(-x[1], x[0]))
root = tree(nodeinfo[0])
for i in range(1, len(nodeinfo)):
temp = tree(nodeinfo[i])
tree_push(root, temp)
preorder(root, answer[0])
postorder(root, answer[1])
return answer
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
'알고리즘[Python] > 프로그래머스' 카테고리의 다른 글
[ Lv 3 ] 야근 지수 (0) | 2021.07.25 |
---|---|
[ Lv 3 ] 기지국 설치 (0) | 2021.07.24 |
[ Lv 3 ] 이중우선순위큐 (0) | 2021.07.23 |
[ Lv 3 ] N으로 표현 (0) | 2021.07.23 |
[ Lv 3 ] 멀리 뛰기 (0) | 2021.07.22 |