๐ข ํธ๋ฆฌ์ ์ํ
1. ๋ฌธ์ ๋งํฌ
2. ์ฝ๋
Python3
72364KB
412ms
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""
[2263] ํธ๋ฆฌ์ ์ํ
๐ ๋ฌธ์
n๊ฐ์ ์ ์ ์ ๊ฐ๋ ์ด์ง ํธ๋ฆฌ์ ์ ์ ์ 1๋ถํฐ n๊น์ง์ ๋ฒํธ๊ฐ ์ค๋ณต ์์ด ๋งค๊ฒจ์ ธ ์๋ค.
์ด์ ๊ฐ์ ์ด์ง ํธ๋ฆฌ์ ์ธ์ค๋์ ํฌ์คํธ์ค๋๊ฐ ์ฃผ์ด์ก์ ๋, ํ๋ฆฌ์ค๋๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ ์
๋ ฅ
์ฒซ์งธ ์ค์ n(1 โค n โค 100,000)์ด ์ฃผ์ด์ง๋ค.
๋ค์ ์ค์๋ ์ธ์ค๋๋ฅผ ๋ํ๋ด๋ n๊ฐ์ ์์ฐ์๊ฐ ์ฃผ์ด์ง๊ณ ,
๊ทธ ๋ค์ ์ค์๋ ๊ฐ์ ์์ผ๋ก ํฌ์คํธ์ค๋๊ฐ ์ฃผ์ด์ง๋ค.
๐ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ๋ฆฌ์ค๋๋ฅผ ์ถ๋ ฅํ๋ค.
"""
# 1) ํ์์ํ์์ ๋ง์ง๋ง์ ์ค๋ ๊ฐ์ ํธ๋ฆฌ์ ๋ฃจํธ
# 2) ์ค์์ํ์์ ๋ฃจํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ
# 3) ํ์์ํ๋ฅผ ์ค์์ํ์ ๊ฐ์ด ๋๋ ํ ๊ฐ ์๋ธ ํธ๋ฆฌ์์ ๋ง์ง๋ง์ ์ค๋ ๊ฐ์ ์๋ธ ํธ๋ฆฌ์ ๋ฃจํธ
# ํ์ด์ฌ์ ์ฌ๊ท ์ต๋ ๊น์ด์ ๊ธฐ๋ณธ ์ค์ ์ด 1,000ํ ์ด๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline
n = int(input())
inorder = list(map(int, input().split()))
postorder = list(map(int, input().split()))
# inorder์ ๊ฐ index ๋ฆฌ์คํธ
inorder_pos = [0] * (n+1)
def preorder(inorder_s, inorder_e, postorder_s, postorder_e):
# ์ฌ๊ทํจ์ ์ข
๋ฃ ์กฐ๊ฑด
if (inorder_s > inorder_e) or (postorder_s > postorder_e):
return
# ํ์ ์ํ์ ๋ง์ง๋ง ๋
ธ๋ ์ถ๋ ฅ
p = postorder[postorder_e]
print(p, end =' ')
# ์ผ์ชฝ ์๋ธํธ๋ฆฌ ๋
ธ๋์ ๊ฐ์
left = inorder_pos[p] - inorder_s
# ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๋
ธ๋์ ๊ฐ์
right = inorder_e - inorder_pos[p]
# ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ
preorder(inorder_s, inorder_s+left-1, postorder_s, postorder_s+left-1)
# ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ
preorder(inorder_e - right + 1, inorder_e, postorder_e - right, postorder_e - 1)
# ํ์์ํ์ ๋ง์ง๋ง๊ฐ์ด ์ค์์ํ ๋ช๋ฒ์งธ์ ์กด์ฌํ๋์ง ์๊ธฐ ์ํด
for i in range(n):
inorder_pos[inorder[i]] = i
preorder(0, n-1, 0, n-1)
3. ํด์ค
This post is licensed under CC BY 4.0 by the author.