Skip to content

Latest commit

ย 

History

History

BOJ_1068_ํŠธ๋ฆฌ

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

๋ฐฑ์ค€ #1068 ํŠธ๋ฆฌ

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” ๋ฌธ์ œ ํ’€์ด์ž…๋‹ˆ๋‹ค.
  • ๋ฐฑ์ค€ 1068๋ฒˆ ์—์„œ ํ’€์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์„ค๋ช…

  • ํŠธ๋ฆฌ์—์„œ ๋ฆฌํ”„ ๋…ธ๋“œ๋ž€, ์ž์‹์˜ ๊ฐœ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ๋งํ•œ๋‹ค. ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋…ธ๋“œ ํ•˜๋‚˜๋ฅผ ์ง€์šธ ๊ฒƒ์ด๋‹ค. ๊ทธ ๋•Œ, ๋‚จ์€ ํŠธ๋ฆฌ์—์„œ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋…ธ๋“œ๋ฅผ ์ง€์šฐ๋ฉด ๊ทธ ๋…ธ๋“œ์™€ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์†์ด ํŠธ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
  • ์ฒซ์งธ ์ค„์— ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” 0๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ N-1๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€, ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋งŒ์•ฝ ๋ถ€๋ชจ๊ฐ€ ์—†๋‹ค๋ฉด (๋ฃจํŠธ) -1์ด ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„์—๋Š” ์ง€์šธ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

ํ’€์ด1. ๋…ธ๋“œ๋กœ ํŠธ๋ฆฌ ๊ตฌํ˜„

from collections import deque

n = int(input())
arr_node = list(map(int, input().split(" ")))
delete = int(input())

class Node:
    def __init__(self, value, parent):
        self.value = value
        self.parent = parent
        self.child = []

    def find(self, root, value):
        node = None

        def recur(curr):
            nonlocal node
            if curr.value == value:
                node = curr
                return

            for i in curr.child:
                recur(i)

        recur(root)
        return node

def solution():

    val_nodes = []
    for value, node in enumerate(arr_node):
        val_nodes.append(Node(value, node))

    for i in val_nodes:
        for j in val_nodes:
            if i.value == j.parent:
                i.child.append(j)

    val_nodes = sorted(val_nodes, key=lambda x : x.parent)
    for i in val_nodes:
        if i.value == delete:
            if i.parent == -1:
                print(0)
                return

            children = i.find(val_nodes[0], i.parent).child
            if not children:
                break
            else:
                children.remove(i)

    count = 0
    dq = deque([])
    dq.append(val_nodes[0])
    while dq:
        node = dq.popleft()
        if not node.child:
            count += 1
        else:
            for i in node.child:
                dq.append(i)
    print(count)

solution()

ํ’€์ด2. dfs

dfs ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ฆฌํ”„๋…ธ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
๋งŒ์•ฝ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐํ•ด์•ผํ•˜๋Š” ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ, ๋ถ€๋ชจ์˜ ์ž์‹ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•œ๋‹ค. ์ž์‹์ด ํ•œ ๊ฐœ์ผ ๊ฒฝ์šฐ ํ•ด๋‹น๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋ถ€๋ชจ๊ฐ€ ๋ฆฌํ”„๋…ธ๋“œ๊ฐ€ ๋˜๋ฏ€๋กœ ๋ฆฌํ”„๋…ธ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

from sys import stdin

def dfs(idx):
    if idx not in children:
        ans[0] += 1
        return

    for c in children[idx]:
        if c == delnode:
            if len(children[idx]) < 2:
                ans[0] += 1
            continue
        dfs(c)

n = int(stdin.readline())
info = list(map(int, stdin.readline().split()))
delnode = int(stdin.readline())
children = dict()
root = 0
ans = [0]

for i, par in enumerate(info):
    if par == -1:
        root = i
        continue

    if par in children:
        children[par].append(i)
    else:
        children[par] = [i]

if delnode == root:
    print(0)
else:
    dfs(root)
    print(ans[0])

ํ’€์ด3. ๋ฐฐ์—ด ์•ˆ์—์„œ ํ•ด๊ฒฐ

N = int(input())
arr = list(map(int, input().split()))
removed = int(input()) # ์‚ญ์ œ๋œ ๋…ธ๋“œ

leafs = []
root = -1
for index in range(N):
    if arr[index] == -1: # ๋ฃจํŠธ ๋…ธ๋“œ ์ฐพ๊ธฐ
        root = index
    if index not in arr: # leaf๋…ธ๋“œ ์ฐพ๊ธฐ
        leafs.append(index)

parent = arr[removed]

for index in range(N):
    cur = index
    while cur != -1:
        if  cur == removed:
            if index in leafs:
                leafs.remove(index) # ๋ฆฌํ”„๋…ธ๋“œ์—์„œ ์‚ญ์ œ
            break
        cur = arr[cur]

count = 0 # ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ๊ฐ€์ง„ ์ž์‹์˜ ์ˆ˜
for elem in arr:
    if elem == parent:
        count += 1
if removed == root : # ์‚ญ์ œํ•œ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ์ผ๊ฒฝ์šฐ 0
    print(0)
elif count == 1:  # ์ž์‹์˜ ์ˆ˜๊ฐ€ 1์ธ ๊ฒฝ์šฐ leaf ํ•œ๊ฐœ ์ถ”๊ฐ€
    print(len(leafs)+1)
else:
    print(len(leafs))