๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 11725_ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ ์ฐพ๊ธฐ

๋ฟŒ์•ผ._. 2022. 3. 11. 22:41

Silver II

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/11725)

<ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ ์ฐพ๊ธฐ>

๋ฌธ์ œ 

 

๋ฃจํŠธ ์—†๋Š” ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ, ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ฅผ 1์ด๋ผ๊ณ  ์ •ํ–ˆ์„ ๋•Œ, ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

 

์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N (2 ≤ N ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N-1๊ฐœ์˜ ์ค„์— ํŠธ๋ฆฌ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋œ ๋‘ ์ •์ ์ด ์ฃผ์–ด์ง„๋‹ค.

 

์ถœ๋ ฅ 

 

์ฒซ์งธ ์ค„๋ถ€ํ„ฐ N-1๊ฐœ์˜ ์ค„์— ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ 2๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

- ์ดˆ๊ธฐ ์ฝ”๋“œ: ์‹œ๊ฐ„ ์ดˆ๊ณผ

 

import sys

def bfs(graph, start, result):
    visited=[start]
    queue=[start]
    while queue:
        temp=queue.pop(0)
        for i in graph[temp]:
            if i not in visited:
                visited.append(i)
                result[i-1]=temp
                queue.append(i)

if __name__=='__main__':
    n=int(input()) # ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜

    graph={1:[]} # ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ

    for i in range(n-1):
        x,y=map(int ,sys.stdin.readline().split()) # ์—ฐ๊ฒฐ๋œ ๋‘ ์ •์ 
        if x not in graph:
            if y in graph:
                graph[y].append(x)
                graph[x]=[]
        elif y not in graph:
            if x in graph:
                graph[x].append(y)
                graph[y]=[]

    result=[0]*n
    bfs(graph, 1,result)

    for i in range(1,n):
        print(result[i])

 

โ“ ์–ด๋””์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๊ฐ€?

์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ถ€๋ถ„์„ ์ฐพ์ง€ ๋ชปํ•ด ๊ฒ€์ƒ‰์„ ํ•ด๋ณด๋‹ˆ not in๊ณผ append๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐฉ๋ฌธ์„ ํ•˜๋ฉด list์— ๋„ฃ์–ด์ฃผ๋˜ ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ False๋กœ ์„ ์–ธํ•œ ํ›„ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด True๋กœ ๋ฐ”๊ฟ”์ฃผ๋„๋ก ํ•˜๋Š” ์ฝ”๋“œ๋กœ ๊ณ ์ณค๋”๋‹ˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

โ“ ๊ทธ๋Ÿผ ์™œ ํ‹€๋ ธ๋Š”๊ฐ€?

์˜ˆ์™ธ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์ž…๋ ฅ์ด ์ฐจ๋ก€๋Œ€๋กœ ์ž˜ ๋“ค์–ด์™€์•ผ ๊ฒฐ๊ณผ๊ฐ€ ์ œ๋Œ€๋กœ ๋‚˜์˜ค๋Š” ์ฝ”๋“œ์˜€๋‹ค.

๋งŒ์•ฝ ์ž…๋ ฅ๋ฐ›๋Š” ๋ถ€๋ถ„์—์„œ ์•„์ง dict์˜ key๊ฐ’์— ์—†๋Š” ๊ฐ’๋“ค์ด ๋‚˜์™”๋‹ค๋ฉด ๊ทธ ๋…ธ๋“œ๋“ค์€ ์ถœ๋ ฅ์—์„œ 0์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด 

5

1 3

2 4

3 4

2 5

์™€ ๊ฐ™์€ ์˜ˆ์ œ์ด๋‹ค. ์ด ๊ฒฝ์šฐ 2์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ 4๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ๋กœ๋Š” 0์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

 

์ด ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ์ง„์งœ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‚ฌ์‹ค 1์‹œ๊ฐ„๋ฐ–์— ์•ˆ ์ง€๋‚ฌ๋‹ค๋Š” ๊ฒƒ์— ์ถฉ๊ฒฉ ๋จน์Œ

์ฒ˜์Œ์—๋Š” ๋…ธ๋“œ ๋‘ ๊ฐœ ๊ฐ’ ๋‹ค key๊ฐ’์— ์—†๋‹ค๋ฉด ๋…ธ๋“œ ๋‘ ๊ฐœ๋ฅผ ๋งจ ๋’ค๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ•˜์˜€๋‹ค. 

๊ตฌํ˜„ํ•˜๋ฉด์„œ๋„ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋‚  ๊ฒƒ์ž„์„ ํ™•์‹ ํ–ˆ์ง€๋งŒ ํ˜น์‹œ ๋ชฐ๋ผ ๋„์ „ํ•ด๋ดค๋‹ค.

๊ฒฐ๊ณผ๋Š” 53%์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐœ์ƒ

 

์ •๋ง ๋ชฐ๋ผ ๊ฒ€์ƒ‰์˜ ํž˜์„ ๋นŒ๋ ธ๋‹ค. ์™œ ์ด ๊ฐ„๋‹จํ•œ ์ƒ๊ฐ์„ ๋ชปํ–ˆ๋‚˜ ์‹ถ์„ ์ •๋„๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ์–‘๋ฐฉํ–ฅ์œผ๋กœ dict์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค๋Š” ์•„์ฃผ ํฐ hint๋ฅผ ์–ป์–ด๋ฒ„๋ ธ๋‹ค. ์œ„์™€ ๊ฐ™์€ ๋‚˜์˜ ์ฝ”๋“œ์—์„œ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฐ”๋กœ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

- my solution

 

import sys

def bfs(graph, start, result):
    visited=[False]*len(result) # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    visited[start-1]=True
    queue=[start]
    while queue:
        temp=queue.pop(0)
        for i in graph[temp]:
            if visited[i-1]==False: # ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
                visited[i-1]=True # ๋ฐฉ๋ฌธ
                result[i-1]=temp # ๋ถ€๋ชจ ๋…ธ๋“œ ์ €์žฅ
                queue.append(i)

if __name__=='__main__':
    n=int(input()) # ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜

    graph={}
    for i in range(1,n+1):
        graph[i]=[]

    for i in range(n-1):
        x,y=map(int ,sys.stdin.readline().split()) # ์—ฐ๊ฒฐ๋œ ๋‘ ์ •์ 
        graph[x].append(y)
        graph[y].append(x)

    result=[0]*n
    bfs(graph, 1,result)

    for i in range(1,n):
        print(result[i])

 

์œ„์˜ ํ‹€๋ฆฐ ์ฝ”๋“œ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•ด์ง„ ํ†ต๊ณผํ•œ ์ฝ”๋“œ์ด๋‹ค.

  • bfs
    : visited = ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธํ•˜๋Š” list
    : queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต = ์ œ์ผ ์ฒ˜์Œ ๊ฐ’์„ pop ํ•ด์„œ ๊ทธ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฐฉ๋ฌธ ํ›„ ๋ถ€๋ชจ ๋…ธ๋“œ ์ €์žฅ ๋ฐ queue์— ์ €์žฅ
  • main
    : ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ์ž…๋ ฅ
    : ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋งŒํผ dict์— key ์ƒ์„ฑ
    : ์—ฐ๊ฒฐ๋œ ๋‘ ์ •์  ์ž…๋ ฅ - ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ €์žฅ
    : result = ๋ถ€๋ชจ ๋…ธ๋“œ ์ €์žฅํ•  list

์ƒ๊ฐ๐Ÿค”

 

๋ช‡ ๋ฒˆ์˜ ๊ณ ๋น„์™€ ๊ฒ€์ƒ‰์˜ ํž˜์„ ๋นŒ๋ ธ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ•ด๊ฒฐํ•ด์„œ ๋งˆ์Œ์ด ํŽธ์•ˆํ•ด์กŒ๋‹ค.

๊ฐ€๋”์€ ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์ž