본문 바로가기
Develop/Python + SWEA

[SW Expert Academy] 5176. 이진탐색

by Tarra 2022. 3. 17.

5176. 이진탐색


문제)

 

1부터 N까지의 자연수를 이진 탐색 트리에 저장하려고 한다.

이진 탐색 트리는 어떤 경우에도 저장된 값이 왼쪽 서브트리의 루트 <현재 노드 <오른쪽 서브 트리의 루트인 규칙을 만족한다.

추가나 삭제가 없는 경우에는, 완전 이진 트리가 되도록 만들면 효율적인 이진 탐색 트리를 만들수 있다.

다음은 1부터 6까지의 숫자를 완전 이진 트리 형태인 이진 탐색 트리에 저장한 경우이다.

 

 

완전 이진 트리의 노드 번호는 루트를 1번으로 하고 아래로 내려가면서 왼쪽에서 오른쪽 순으로 증가한다.

N이 주어졌을 때 완전 이진 트리로 만든 이진 탐색 트리의 루트에 저장된 값과, N/2번 노드(N이 홀수인 경우 소수점 버림)에 저장된 값을 출력하는 프로그램을 만드시오.

 


[입력]
첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 N이 주어진다. 1<=N<=1000

 


[출력]
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

 

 

풀이)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 해결과정
# 루트노드에 대한 중위순회를 사용하면,
# 1부터 n까지의 각 노드를 알 수 있다.
# 이것을 이용하여, n이 주어졌을 때 n개의 노드에 대한 완전이진트리를 만들고,
# 1번노드(루트노드)에 대해서 중위순회를하며 각 노드에 n까지의 수를 넣어준다.
 
def in_order(v):
    if v:
        in_order(tree[v][0])
        answer.append(v)
        in_order(tree[v][1])
 
= int(input())
for _ in range(T):
    n = int(input())
    tree = [[00for i in range(n + 1)]
 
    for i in range(2, n + 1):
        tree[i // 2][i % 2= i
 
    answer = [0]
    in_order(1)
    print(f"#{_ + 1}", end=" ")
    print(answer.index(1), answer.index(n // 2))
cs

문제 출처 : https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

※ SW Expert 아카데미는 원칙적으로 문제를 무단 복제하는 것을 금지합니다.

학습용으로 문제를 가져왔으나, 문제가 될 시 수정 및 삭제하겠습니다.