๐Ÿ’ป์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œํ’€์ด19

์ง€๋ฏผ์„œยท2023๋…„ 3์›” 16์ผ
0

coding test

๋ชฉ๋ก ๋ณด๊ธฐ
18/30

Chapter11. ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ

[๋ฌธ์ œ47] ๊ธธ ์ฐพ๊ธฐ ๊ฒŒ์ž„ - Level3

์ „๋ฌด๋กœ ์Šน์ง„ํ•œ ๋ผ์ด์–ธ์€ ๊ธฐ๋ถ„์ด ๋„ˆ๋ฌด ์ข‹์•„ ํ”„๋ Œ์ฆˆ๋ฅผ ์ด๋Œ๊ณ  ํŠน๋ณ„ ํœด๊ฐ€๋ฅผ ๊ฐ€๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋‚ด์นœ๊น€์— ์—ฌํ–‰ ๊ณ„ํš๊นŒ์ง€ ๊ตฌ์ƒํ•˜๋˜ ๋ผ์ด์–ธ์€ ์žฌ๋ฏธ์žˆ๋Š” ๊ฒŒ์ž„์„ ์ƒ๊ฐํ•ด๋ƒˆ๊ณ  ์—ญ์‹œ ์ „๋ฌด๋กœ ์Šน์ง„ํ•  ๋งŒํ•œ ์ธ์žฌ๋ผ๊ณ  ์Šค์Šค๋กœ์—๊ฒŒ ๊ฐํƒ„ํ–ˆ๋‹ค.

๋ผ์ด์–ธ์ด ๊ตฌ์ƒํ•œ(๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋ผ์ด์–ธ๋งŒ ์ฆ๊ฑฐ์šธ ๋“ฏํ•œ) ๊ฒŒ์ž„์€, ์นด์นด์˜ค ํ”„๋ Œ์ฆˆ๋ฅผ ๋‘ ํŒ€์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ํŒ€์ด ๊ฐ™์€ ๊ณณ์„ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธํ•˜๋„๋ก ํ•ด์„œ ๋จผ์ € ์ˆœํšŒ๋ฅผ ๋งˆ์นœ ํŒ€์ด ์Šน๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ƒฅ ์ง€๋„๋ฅผ ์ฃผ๊ณ  ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด ์žฌ๋ฏธ๊ฐ€ ๋œํ•ด์ง€๋ฏ€๋กœ, ๋ผ์ด์–ธ์€ ๋ฐฉ๋ฌธํ•  ๊ณณ์˜ 2์ฐจ์› ์ขŒํ‘ฏ๊ฐ’์„ ๊ตฌํ•˜๊ณ  ๊ฐ ์žฅ์†Œ๋ฅผ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๊ฐ€ ๋˜๋„๋ก ๊ตฌ์„ฑํ•œ ํ›„, ์ˆœํšŒ ๋ฐฉ๋ฒ•์„ ํžŒํŠธ๋กœ ์ฃผ์–ด ๊ฐ ํŒ€์ด ์Šค์Šค๋กœ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋„๋ก ํ•  ๊ณ„ํš์ด๋‹ค.

๋ผ์ด์–ธ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๊ทœ์น™์œผ๋กœ ํŠธ๋ฆฌ ๋…ธ๋“œ๋“ค์„ ๊ตฌ์„ฑํ•œ๋‹ค.

  • ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ x, y ์ขŒํ‘ฏ๊ฐ’์€ ์ •์ˆ˜์ด๋‹ค.
  • ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ x๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
  • ๊ฐ™์€ ๋ ˆ๋ฒจ(level)์— ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๊ฐ™์€ y ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์ž์‹ ๋…ธ๋“œ์˜ y ๊ฐ’์€ ํ•ญ์ƒ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘๋‹ค.
  • ์ž„์˜์˜ ๋…ธ๋“œ V์˜ ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ(left subtree)์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ x ๊ฐ’์€ V์˜ x ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค.
  • ์ž„์˜์˜ ๋…ธ๋“œ V์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ(right subtree)์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ x ๊ฐ’์€ V์˜ x ๊ฐ’๋ณด๋‹ค ํฌ๋‹ค.

๊ณค๊ฒฝ์— ๋น ์ง„ ์นด์นด์˜ค ํ”„๋ Œ์ฆˆ๋ฅผ ์œ„ํ•ด ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋…ธ๋“œ๋“ค์˜ ์ขŒํ‘œ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด nodeinfo๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์กฐ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ „์œ„ ์ˆœํšŒ, ํ›„์œ„ ์ˆœํšŒํ•œ ๊ฒฐ๊ณผ๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด์— ์ˆœ์„œ๋Œ€๋กœ ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์ž.

[์ œํ•œ์‚ฌํ•ญ]

  • nodeinfo๋Š” ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ ๋…ธ๋“œ์˜ ์ขŒํ‘œ๊ฐ€ 1๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด ์žˆ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์ด๋‹ค.
    • nodeinfo์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜์ด๋‹ค.
    • nodeinfo{i}๋Š” i+1๋ฒˆ ๋…ธ๋“œ์˜ ์ขŒํ‘œ์ด๋ฉฐ, {x์ถ• ์ขŒํ‘œ, y์ถ• ์ขŒํ‘œ} ์ˆœ์œผ๋กœ ๋“ค์–ด์žˆ๋‹ค.
    • ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ขŒํ‘ฏ๊ฐ’์€ 0 ์ด์ƒ 100,000 ์ดํ•˜์ธ ์ •์ˆ˜์ด๋‹ค.
    • ํŠธ๋ฆฌ์˜ ๊นŠ์ด๊ฐ€ 1,000 ์ดํ•˜์ธ ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.
    • ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ขŒํ‘œ๋Š” ๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉฐ, ์ž˜๋ชป๋œ ๋…ธ๋“œ ์œ„์น˜๊ฐ€ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

[์ฝ”๋“œ์ž‘์„ฑ]

1. ํŠธ๋ฆฌ๋ฅผ ๋‹ด์„ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

class node:
	def __init__(self, info):
    	self.number = info[2]
        self.data = info[:2]
        self.right = None
        self.left = None

1-1. ํŠธ๋ฆฌ์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

def addnode(root, info):
	if info[0] > root.data[0]:
    	if not root.right: root.right = node(info)
        else: addnode(root.right, info)
    elif info[0] < root.data[0]:
    	if not root.left: root.left = node(info)
        else: addnode(root.left, info)

2. ์ „์œ„ ์ˆœํšŒ/ํ›„์œ„ ์ˆœํšŒ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

def preorder(root, order):
	if root != None:
    	order.append(root.number)
        preorder(root.left, order)
        preorder(root.right, order)
        
def preorder(root, order):
	if root != None:
    	postorder(root.left, order)
        postorder(root.right, order)
        order.append(root.number)

3. ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์— ๋งž๊ฒŒ ์ •๋ ฌํ•˜๊ณ  ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑ

def solution(nodeinfo):
	nodeinfo = [[*info, idx + 1] for idx, info in enumerate(nodeinfo)]
    nodeinfo = sorted(nodeinfo, key=lambda x: x[1], reverse=True)
    
    root = node(nodeinfo[0])
    for info in nodeinfo[1:]:
    	addnode(root, info)

4. ๊ฐ ์ˆœํšŒ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์น˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

preorderList = []
preorder(root, preorderList)

postorderList = []
postorder(root, postorderList)

return [preorderList, postorderList]

[์ „์ฒด์ฝ”๋“œ]

import sys
sys.setrecursionlimit(10**6)

class node:
	def __init__(self, info):
    	self.number = info[2]
        self.data = info[:2]
        self.right = None
        self.left = None
        
def addnode(root, info):
	if info[0] > root.data[0]:
    	if not root.right: root.right = node(info)
        else: addnode(root.right, info)
    elif info[0] < root.data[0]:
    	if not root.left: root.left = node(info)
        else: addnode(root.left, info)
        
def preorder(root, order):
	if root != None:
    	order.append(root.number)
        preorder(root.left, order)
        preorder(root.right, order)
        
def postorder(root, order):
	if root != None:
    	postorder(root.left, order)
        postorder(root.right, order)
        order.append(root.number)
        
def solution(nodeinfo):
	nodeinfo = [[*info, idx + 1] for idx, info in enumerate(nodeinfo)]
    nodeinfo = sorted(nodeinfo, key = lambda x: x[1], reverseTrue)
    
    root = node(nodeinfo[0])
    
    for info in nodeinfo[1:]:
    	addnode(root, info)
        
    preorderList = []
    preorder(root, preorderList)
    
    postorderList = []
    postorder(root, postorderList)
    
    return [preorderList, postorderList]

[์ฝ”๋“œ์ž‘์„ฑ2]

1. ํŠธ๋ฆฌ๋ฅผ ๋‹ด์„ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

def solution(nodeinfo):
	nodeinfo = [[*info, idx + 1] for idx, info in enumerate(nodeinfo)]
    y = sorted(nodeinfo, key=lambda x: -x[1])
    x = sorted(nodeinfo)

2. ์ „์œ„ ์ˆœํšŒ/ํ›„์œ„ ์ˆœํšŒ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

def preorder(y, x, answer):
	node = y[0]
    idx = x.index(node)
    left, right = [], []
    
    for i in range(1, len(y)):
    	if node[0] > y[i][0]: right.append(y[i])
        else: left.append(y[i])
        
    answer.append(node[2])
    if len(right) > 0: preorder(right, x[:idx], answer)
    if len(left) > 0: preorder(left, x[idx + 1], answer)
    
def postorder(y, x, answer):
	node = y[0]
    idx = x.index(node)
    left, right = [], []
    
	for i in range(1, len(y)):
    	if node[0] > y[i][0]: right.append(y[i])
        else: left.append(y[i])
        
    if len(right) > 0: postorder(right, x[:idx], answer)
    if len(left) > 0: postorder(left, x[idx + 1:], answer)
    answer.append(node[2])

3. ๊ฐ ์ˆœํšŒ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์น˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

preorderList = []
postorderList = []

preorder(y, x, preorderList)
postorder(y, x, postorderList)

return [preorderList, postorderList]

[์ „์ฒด์ฝ”๋“œ2]

def preorder(y, x, answer):
	node = y[0]
    idx = x.index(node)
    left, right = [], []
    
    for i in range(1, len(y)):
    	if node[0] > y[i][0]: right.append(y[i])
        else: left.append(y[i])
        
    answer.append(node[2])
    if len(right) > 0: preorder(right, x[:idx], answer)
    if len(left) > 0: preorder(left, x[idx + 1], answer)
    
def postorder(y, x, answer):
	node = y[0]
    idx = x.index(node)
    left, right = [], []
    
	for i in range(1, len(y)):
    	if node[0] > y[i][0]: right.append(y[i])
        else: left.append(y[i])
        
    if len(right) > 0: postorder(right, x[:idx], answer)
    if len(left) > 0: postorder(left, x[idx + 1:], answer)
    answer.append(node[2])
    
def solution(nodeinfo):
	nodeinfo = [[*info, idx + 1] for idx, info in enumerate(nodeinfo)]
    y = sorted(nodeinfo, key=lambda x: -x[1])
    x = sorted(nodeinfo)
    
    preorderList = []
    postorderList = []

    preorder(y, x, preorderList)
    postorder(y, x, postorderList)

    return [preorderList, postorderList]
profile
๐Ÿ’ป + ๐ŸŽฅ

0๊ฐœ์˜ ๋Œ“๊ธ€