Tiny Bunny
본문 바로가기
Algorithm/Python

[SWEA #1231] 중위순회

by nowag 2024. 2. 20.

문제

주어진 트리를 in-order 형식으로 순회해 각 노드를 읽으면 특정 단어를 알 수 있다.

위 트리를 in-order 형식으로 순회할 경우 SOFTWARE 라는 단어를 읽을 수 있다.
주어진 트리를 in-order 형식으로 순회했을때 나오는 단어를 출력하라.

제약 사항
트리는 완전 이진 트리 형식으로 주어지며, 노드당 하나의 문자만 저장할 수 있다.
노드는 아래 그림과 같은 순서로 주어진다.


입력
총 10개의 테스트 케이스가 주어진다. (총 테스트 케이스의 개수는 입력으로 주어지지 않는다)
각 테스트 케이스의 첫 줄에는 트리가 갖는 정점의 총 수 N(1≤N≤100)이 주어진다. 그 다음 N줄에 걸쳐 각각의 정점 정보가 주어진다.
정점 정보는 해당 정점의 문자, 해당 정점의 왼쪽 자식, 오른쪽 자식의 정점 번호 순서로 주어진다.
정점 번호는 1부터 N까지의 정수로 구분된다. 정점 번호를 매기는 규칙은 위 와 같으며, 루트 정점의 번호는 항상 1이다.

위의 예시에서,  알파벳 ‘F’가 2번 정점에 해당하고 두 자식이 각각 알파벳 ‘O’인 4번 정점과 알파벳 ‘T’인 5번 정점이므로 “2 F 4 5”로 주어진다.
알파벳 S는 8번 정점에 해당하므로 “8 S” 로 주어진다.

출력
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.

 

내가 쓴 코드

def inorder(root):
    if root:
        inorder(left[root])
        # print(root, end='')
        word.append(root)
        inorder(right[root])

for t in range(10):
    N = int(input())        # N : 정점 수
    left = [0] * (N+1)
    right = [0] * (N+1)
    parent = [0] * (N+1)
    word_lst = []
    for n in range(N):
        arr = list(input().split())
        word_lst.append(arr[1])
        for i in range(len(arr)):
            if i >= 2:
                p, c = int(arr[0]), int(arr[i])
                if left[p] == 0:
                    left[p] = c
                else:
                    right[p] = c
                parent[c] = p
    word = []
    inorder(1)
    print(f'#{t+1}', end=' ')
    for i in word:  # 1~8
        print(word_lst[int(i)-1], end='')
    print()

순회 이친구 재밌는 친굴세 ㅎㅎ

 

출력 결과

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[SWEA #12915] 이진탐색  (0) 2024.02.20
[BOJ #11721] 열 개씩 끊어 출력하기  (0) 2024.02.20
[SWEA #12914] subtree  (1) 2024.02.20
[BOJ #18258] 큐2  (0) 2024.02.19
[SWEA #11651] 큐 - 노드의 거리  (1) 2024.02.16