새소식

반응형
Algotithms

[2019 KAKAO BLIND RECRUITMENT] 길 찾기 게임

  • -
728x90
반응형

문제

  • 좌표가 주어졌을 때 전위 순회와 후위 순회의 결과 리턴하기
    • 자식 노드의 y값은 항상 부모 노드보다 작다.
    • V노드의 왼쪽 서브트리의 x값은 항상 V의 x값보다 작고 오른쪽 서브트리는 크다.
  • 1 <= 노드 개수 <= 10,000
  • 1 <= 트리 깊이 <= 1000

 

 

풀이 (1h +)

  • (x좌표, y좌표, 노드 번호)에서 x좌표를 기준으로 정렬한다.
  • 루트를 구한 뒤, 전위 순회와 후위 순회를 한다.
    • 전위 순회 : 루트 - 왼쪽 - 오른쪽
    • 후위 순회 : 오른쪽 - 왼쪽 - 루트
  • 루트의 x좌표가 7이면 왼쪽 sub tree 는 x좌표가 7보다 작아야 하고 오른쪽 sub tree는 7보다 커야 한다.
    따라서 루트의 x좌표의 인덱스를 기준으로 각각의 sub tree를 구분할 수 있다.
  • 각 sub tree의 순회는 재귀를 통해 순회를 반복한다

 

import sys
sys.setrecursionlimit(10**4)

# 루트 찾기
def find_root(coord_x) :
    rx, ry, ri, x_idx = 0, 0, 0, 0
    for idx, (x, y, i) in enumerate(coord_x) :
        if y >= ry :
            rx, ry, ri, x_idx = x, y, i, idx
    return rx, ry, ri, x_idx

# 트리 순회하기
# 전위 순회 : 루트 - 왼쪽 - 오른쪽
# 후위 순회 : 오른쪽 - 왼쪽 - 루트
def treeorder(coord_x, order, how="pre") :
    rx, ry, ri, x_idx = find_root(coord_x)	# 루트 찾기

    if how == "pre" :           # 루트 (전위 순회)
        order += [ri]			 
    if x_idx > 0 :              # 왼쪽 자식
        order += treeorder(coord_x[:x_idx], [], how)
    if x_idx < len(coord_x)-1 : # 오른쪽 자식
        order += treeorder(coord_x[x_idx+1:], [], how)
    if how == "post" :          # 루트 (후위 순회)
        order += [ri]
        
    return order

    
def solution(nodeinfo):
    n = len(nodeinfo)   # 노드 개수
    # nodeinfo : (x좌표, y좌표, 노드 번호)
    nodeinfo = [(x, y, i+1) for i, (x, y) in enumerate(nodeinfo) ] 
    coord_x = sorted(nodeinfo, key=lambda x: x[0])  # x좌표 순으로 정렬
    
    return [treeorder(coord_x, [], "pre"), treeorder(coord_x, [], "post")]
반응형

'Algotithms' 카테고리의 다른 글

[2019 KAKAO BLIND RECRUITMENT] 블록 게임  (0) 2023.09.06
[2019 KAKAO BLIND RECRUITMENT] 매칭 점수  (0) 2023.09.04
[백준] 1058 친구  (0) 2023.09.03
[백준] 1325 효율적인 해킹  (0) 2023.09.03
[백준] 5597 과제 안 내신 분..?  (0) 2023.09.03
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.