๐ณ ์ด์ง ๊ฒ์ ํธ๋ฆฌ
๋ฐฑ์ค Class4 Gold5
solved_ac[Class4] ์ด์ง ๊ฒ์ ํธ๋ฆฌ
๋ฌธ์
์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ด์ง ํธ๋ฆฌ์ด๋ค.
- ๋ ธ๋์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ๋ชจ๋ ๋ ธ๋์ ํค๋ ๋ ธ๋์ ํค๋ณด๋ค ์๋ค.
- ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ๋ชจ๋ ๋ ธ๋์ ํค๋ ๋ ธ๋์ ํค๋ณด๋ค ํฌ๋ค.
- ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ์ด๋ค.
์ ์ ์ํ (๋ฃจํธ-์ผ์ชฝ-์ค๋ฅธ์ชฝ)์ ๋ฃจํธ๋ฅผ ๋ฐฉ๋ฌธํ๊ณ , ์ผ์ชฝ ์๋ธํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๋ฅผ ์์๋๋ก ๋ฐฉ๋ฌธํ๋ฉด์ ๋ ธ๋์ ํค๋ฅผ ์ถ๋ ฅํ๋ค. ํ์ ์ํ (์ผ์ชฝ-์ค๋ฅธ์ชฝ-๋ฃจํธ)๋ ์ผ์ชฝ ์๋ธํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ, ๋ฃจํธ ๋ ธ๋ ์์๋๋ก ํค๋ฅผ ์ถ๋ ฅํ๋ค. ์๋ฅผ ๋ค์ด, ์์ ์ด์ง ๊ฒ์ ํธ๋ฆฌ์ ์ ์ ์ํ ๊ฒฐ๊ณผ๋ 50 30 24 5 28 45 98 52 60 ์ด๊ณ , ํ์ ์ํ ๊ฒฐ๊ณผ๋ 5 28 24 45 30 60 52 98 50 ์ด๋ค.
์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ฅผ ์ ์ ์ํํ ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ก์ ๋, ์ด ํธ๋ฆฌ๋ฅผ ํ์ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
ํธ๋ฆฌ๋ฅผ ์ ์ ์ํํ ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ง๋ค. ๋ ธ๋์ ๋ค์ด์๋ ํค์ ๊ฐ์ 106๋ณด๋ค ์์ ์์ ์ ์์ด๋ค. ๋ชจ๋ ๊ฐ์ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ฉฐ, ๋ ธ๋์ ์๋ 10,000๊ฐ ์ดํ์ด๋ค. ๊ฐ์ ํค๋ฅผ ๊ฐ์ง๋ ๋ ธ๋๋ ์๋ค.
์ถ๋ ฅ
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ฅผ ํ์ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
50
30
24
5
28
45
98
52
60
์์ ์ถ๋ ฅ 1
5
28
24
45
30
60
52
98
50
๐ ์๋ฃ๊ตฌ์กฐ
โญ๏ธ [BST๋ ๋ฐ์ดํฐ ํ์ ์๋๋ฅผ ๋์ด๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.] โญ๏ธ
Binary Search Tree
์ด์ง ํธ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ ํ ๊ตฌ์กฐ์ ์ํ๋ค.
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ ํธ๋ฆฌ์์ โ24โ๋ฅผ ์ฐพ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ์.
๊ทธ๋ ๋ค๋ฉด ๋ฃจํธ ๋ ธ๋์ธ โ50โ์ ํ์ธํด๋ณด์์ ๋, โ24 < 50โ์ด๋ฏ๋ก ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๋ ๋ ์ด์ ํ์ธ ์ํด๋ ๋๋ฏ๋ก ๊ฐ์ง์น๊ธฐ๋ฅผ ํ ์ ์๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด ์ฐ์ฐ๋์ด ์ ๋ฐ์ผ๋ก ์ค์ด๋ค๊ณ ๋ฐ๋ผ์ BST์ ์๊ฐ๋ณต์ก๋๋ O(logN)์ด๋ค.
์ ํ ๊ตฌ์กฐ์ธ ๋ฆฌ์คํธ์ ํ์ ์๋๊ฐ O(N)์ด๋ฏ๋ก ๋ฐ์ดํฐ ํ์ ์๋๊ฐ ํจ์ฌ ๋น ๋ฅด๋ค๊ณ ํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ต์ ์ ๊ฒฝ์ฐ(์ผ์ชฝ ์๋ธ ํธ๋ฆฌ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ OR ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ) ์๊ฐ๋ณต์ก๋๊ฐ ๋์ผํ๊ฒ O(N)์ผ๋ก ์ํ๋ ์ ์๋ค.
ํ์ ์ํ
์ด ๋ฌธ์ ์์๋ Binary Tree๊ฐ ์ฃผ์ด์ก์ ๋ ํ์ ์ํ ํจ์ ๊ตฌํ์ ์๊ตฌํ๋ค.
์ผ์ข ์ ๊ณต์์ฒ๋ผ ์ธ์๋ ๋๊ฒ ์ง๋ง ์ฅ๊ธฐ ๊ธฐ์ต์ ํ๊ธฐ ์ํ์ฌ ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํดํด๋ณด์.
- ์์ ๋ ธ๋์ ๋ ๋ ธ๋๋ฅผ ์ ํ๋ค.
- ์์ ๋ ธ๋๊ฐ ๋ ๋ ธ๋๋ฅผ ์์ง๋ฌ๊ฐ๋ฉด ์ข ๋ฃํ๋ค.
- ํ์ ์ํ์ ํฌ์ธํธ๋ <์ผ์ชฝ ๐๐ป ์ค๋ฅธ์ชฝ ๐๐ป ๋ฃจํธ ๋ ธ๋> ์ด๋ค.
- ๋ฐ๋ผ์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ Sub Tree๋ฅผ ๊ตฌ๋ถํ๋ค.
<์ผ์ชฝ ๐๐ป ์ค๋ฅธ์ชฝ ๐๐ป ๋ฃจํธ ๋ ธ๋> โ์ฌ๊ท๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํโ
- ๊ตฌ๋ถํ ๊ตฌ๋ถ์ ์ ๊ฐ์ง๊ณ ์ผ์ชฝ Sub Tree๋ฅผ ํ์
- ์ค๋ฅธ์ชฝ Sub Tree ํ์
- ๋ฃจํธ ๋ ธ๋ ์ถ๋ ฅ
๐จ๐ปโ๐ป CODE
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
### ๋ฌธ์ ์กฐ๊ฑด ###
binary_tree = []
while True:
try:
binary_tree.append(int(input()))
except:
break
### ###
# BST ํ์ ์ํ
def post_order(start,end):
if start > end:
return
root = end+1 # ์ค๋ฅธ์ชฝ Sub Tree๊ฐ ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋น
for i in range(start+1,end+1):
# ์ค๋ฅธ์ชฝ Sub Tree ๋ฐ๊ฒฌ
if binary_tree[i] > binary_tree[start]:
root = i
break
post_order(start+1,root-1) # ์ผ์ชฝ Sub Tree Traverse
post_order(root,end) # ์ค๋ฅธ์ชฝ Sub Tree Traverse
print(binary_tree[start])
post_order(0,len(binary_tree)-1)
์ฌ๊ท ์ ํ ๊ฑธ์ด์ฃผ๋ ๊ฒ ์ ์