문제설명
https://school.programmers.co.kr/learn/courses/30/lessons/42892
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
참고
문제 해결 방법
주어진 리스트로 트리 만드는 부분 구현후, 스택을 활용해 트리 순회하는 코드 작성함
후위 순회는 방문 여부를 체크 하도록 하여 구현하였음
코드 구현
def solution(nodeinfo):
answer = []
original = nodeinfo
cnt = 0
for i in nodeinfo:
cnt +=1
i.append(cnt)
nodeinfo.sort(key = lambda x : (-x[1], x[0]))
class Node:
def __init__(self, key):
self.left = None
self.right = None
self.val = key[2]
self.x = key[0]
class BST:
def __init__(self):
self.root = None
def insert(self, key):
if not self.root:
self.root = Node(key)
else:
curr = self.root
while 1:
if curr.x > key[0]:
if curr.left:
curr = curr.left
else:
curr.left = Node(key)
break
else:
if curr.right:
curr = curr.right
else:
curr.right = Node(key)
break
def preorder(self, result):
curr = self.root
stackk=[]
stackk.append(curr)
while 1:
if len(stackk) != 0:
curr = stackk.pop()
if curr is None:
continue
result.append(curr.val)
stackk.append(curr.right)
stackk.append(curr.left)
else:
break
return result
def postorder(self, result):
curr = self.root
stackk=[(self.root, False)]
# 이코드 대신 위에 코드 stackk.append(curr, False)
while 1:
if len(stackk) != 0:
curr, visited = stackk.pop()
if curr is None:
continue
if visited:
result.append(curr)
else:
stackk.append((curr.val, True))
stackk.append((curr.right, False))
stackk.append((curr.left, False))
else:
break
return result
bst = BST()
for key in nodeinfo:
bst.insert(key)
result = []
answer.append(bst.preorder(result))
result = []
answer.append(bst.postorder(result))
return answer
시간/공간 복잡도
O(N^2)
최적화 및 개선
하지않음
어려웠던 점
트리 구성 까지는 할 수 있는데, 트리 순회할때 재귀함수를 사용하지 않고 스택으로 구현하려니 어려웠다.
'코딩테스트 > 문제 풀이 - Python' 카테고리의 다른 글
[프로그래머스 lv2]전화번호 목록.ver2 (0) | 2024.04.05 |
---|---|
[프로그래머스 lv2]영어 끝말잇기.ver2 (0) | 2024.04.05 |
[프로그래머스 lv3]미로 탈출 (0) | 2024.03.20 |
[프로그래머스 lv3]다단계 칫솔 판매 (0) | 2024.03.20 |
이진 탐색 트리 구현 (0) | 2024.03.20 |