평범한 필기장

[BOJ_Python] 9934_완전 이진 트리 본문

코딩 테스트 준비/BOJ

[BOJ_Python] 9934_완전 이진 트리

junseok-rh 2023. 3. 9. 02:01

이 문제를 보면 입력의 첫째 줄에는 완전 이진 트리의 깊이가 나와있고 두번째 줄에는 방문 순서 대로 빌딩의 번호가 나와있습니다. 이 문제에서는 기준 노드를 기준으로 좌측 자식 노드를 먼저 방문하고 기준 노드를 방문하고 우측 자식 노드를 방문합니다. (inorder algorithm) 그래서 일단 저는 깊이 만큼의 빈 리스트가 있는 2차원 빈 리스트인 answer list를 만들고 각 레벨에 있는 숫자들을 빈 리스트의 인덱스에 맞게 넣을려고 했습니다. 완전 이진 트리이기 때문에 루트부터 0번째 리스트에 넣으려 했습니다. 이 완전 이진 트리의 루트는 주어진 리스트의 중앙 인덱스에 위치한 값이겠죠? 왜냐하면 완전 이진 트리 특성상 이진 트리가 완전히 꽉 채워져 있기 때문에 루트 노드를 기준으로 좌우의 노드 개수가 같기 때문입니다.

그런데 루트 노드를 기준으로 좌측도 서브 완전 이진트리가 되고 우측도 마찬가지 입니다. 이렇게 앞에서 루트 노드를 빈 리스트에 넣은 방식을 계속 반복을 하게되면 문제에서 원하는 답을 찾을 수 있겠죠? 그래서 전 재귀 함수를 통해 문제를 풀었습니다.

import sys

k = int(input())
lst = list(map(str, sys.stdin.readline().split()))

answer_lst = [[] for _ in range(k)]

def tree(lst, i = 0):
    n = len(lst)
    k = len(lst) // 2
    # 무한대로 반복을 하지 않게 마지막 레벨까지 반복하고 끝내게 하기
    if k == 0:
        answer_lst[i].append(lst[k])
        return
    answer_lst[i].append(lst[k])
    # 재귀함수를 사용한 부분!
    tree(lst[:k], i + 1)
    tree(lst[k+1:], i + 1)

tree(lst)
for i in range(len(answer_lst)):
    print(' '.join(answer_lst[i]))

재귀 함수를 이용해야겠다는 생각은 했는데 제가 코딩 실력이 부족해서 시간이 좀 걸렸습니다ㅜㅜ

 

이 게시글이 첫 게시글인데 제 생각을 글로 쓴다는 것이 어렵네요. (제가 글 재주가 많이 부족합니다,,,)

부족하지만 읽어주셔서 감사합니다.

게시글을 꾸준히 쓰면서 매끄럽게 쓸 수 있도록 노력하겠습니다!!

 

틀린 부분이 있으면 댓글로 말씀해주시면 감사하겠습니다~