일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- curl
- supabase
- prometeus
- API Gateway
- docker
- 파이썬
- monitoring
- java
- kong
- OpenSource
- 하이브리드 데이터 모델
- pyannote
- Spring
- jwt-java
- 자료구조
- ELK
- elastic search
- metricbeat
- konga
- template/callback
- 메소드
- devops
- roll over
- 화자분리
- Nice
- C++
- fosslight
- mybatis
- umc
- DI
Archives
- Today
- Total
youngseo's TECH blog
[PS | 한 번에 맞자!] 백준 4256 본문
0. 문제
4256번: 트리
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 노드의 개수 n이 주어진다. (1 ≤ n ≤ 1,000) BT의 모든 노드에는 1부터 n까지 서로 다른 번호가 매겨져 있다. 다음
www.acmicpc.net
1. 문제 생각
전위순회, 중위순회, 후위순회의 핵심은 규칙과 재귀이다.
재귀에서도 사실상 어디에서 재귀로 진입하는가(반환하는가) 가 가장 중요하다. -> 기초 설명
위 문제에서도 전위, 중위 순회일 떄 규칙적으로 왼쪽/오른쪽으로 빠지는 것이 규칙적으로 진행됨을 알 수 있다.
따라서 recursion을 전위, 중위 순회에 따라 root 노드 -> left 노드 -> right 노드로 들어가도록 구현하고
if (currentNode){
Visit(currentNode);
Postorder(currentNode -> leftChild);
Postorder(currentNode -> rightChild);
Visit(currentNode);
}
그 후 우리는 후위 순회를 구현할 것이므로 위의 함수처럼 맨 나중에 node를 visit하면 된다.
2. 문제 구현
import sys
input = sys.stdin.readline
def recursion(preorder, inorder):
if not preorder:
return
node = preorder[0]
idx = inorder.index(node)
# 전위순회를 반환해야 하면 여기에서 print
recursion(preorder[1:idx+1], inorder[:idx])
# 중위순회를 반환해야 하면 여기에서 print
recursion(preorder[idx+1:], inorder[idx+1:])
# 후위순회를 반환해야 하면 여기에서 print
print(node, end=' ')
t=int(input())
for _ in range(t):
n=int(input())
preorder = list(map(int,input().split()))
inorder = list(map(int,input().split()))
recursion(preorder, inorder)
print()
'알고리즘 > 세부구현' 카테고리의 다른 글
[PS | 한 번에 맞자!] 백준 17828 (0) | 2023.07.17 |
---|---|
[PS | 한 번에 맞자!] 백준 15971 (0) | 2023.07.17 |
[PS | 한 번에 맞자!] 백준 1713 (0) | 2023.07.15 |
[PS | 한 번에 맞자!] 백준 2448 (0) | 2023.07.14 |
[PS | 한 번에 맞자!] 백준 16938 (0) | 2023.07.11 |