๐Ÿงฉ Algorithm/[BOJ] Silver

BOJ 11725๋ฒˆ : ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ ์ฐพ๊ธฐ (Python/Silver 2)

devCloud 2023. 5. 9. 17:30
728x90
 

11725๋ฒˆ: ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ ์ฐพ๊ธฐ

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

www.acmicpc.net


์„ค๋ช…

๋…ธ๋“œ ๊ฐœ์ˆ˜๋ฅผ 7๊ฐœ๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž. 

์˜ˆ์ œ ์ž…๋ ฅ์— ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ ํŠธ๋ฆฌ ์ƒ์—์„œ ์—ฐ๊ฒฐ๋œ ๋‘ ์ •์ ์ด ์ฃผ์–ด์ง„๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํŒŒ๋ž€์ƒ‰ ์ˆซ์ž๋Š” ์˜ˆ์ œ์— ์ž…๋ ฅ๋œ ๋‘ ์ •์ ์„ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์„ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. 

 

ํ’€์ด

์ด ๋ฌธ์ œ๋Š” DFS์™€ BFS ๋ฌธ์ œ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š”๋ฐ ํ•„์ž๋Š” DFS๋กœ ํ’€์—ˆ๋‹ค.

for _ in range(N-1):
    a, b = map(int, input().split())
    #๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๊ฑธ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์— ๊ฐ๊ฐ ์ €์žฅ
    graph[a].append(b)
    graph[b].append(a)

 

์œ„ ์ฝ”๋“œ๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด ์šฐ์ธก ์‚ฌ์ง„์ด๋‹ค. ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ณ , ์ž…๋ ฅ๋ฐ›์€ ๋‘ ์ •์ ์„ ์„œ๋กœ ์ €์žฅํ•œ๋‹ค.

 

 

๋‹ค์Œ์€ dfs๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

def dfs(x):
    for i in graph[x]: 
        if visited[i] == 0: #๋งŒ์•ฝ ํ•ด๋‹น ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
            visited[i] = x #ํ•ด๋‹น ๋…ธ๋“œ์— ์ •์ ์„ ์ €์žฅ
            dfs(i) #๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€

์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ด๋ณด์ž. ์‹ค์ œ ๊ฐ’์„ ๋„ฃ๊ณ  ์„ค๋ช…ํ•œ ๊ฒƒ์ด๋‹ค.

def dfs(1):
    for i in graph[1]:      #i = 6, 4 (6๋ถ€ํ„ฐ ํƒ์ƒ‰)
        if visited[6] == 0: #๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋‹ˆ ํ˜„์žฌ 0์ด๋‹ค.
            visited[6] = 1  #6๋ฒˆ์€ 1๋ฒˆ๊ณผ ์—ฐ๊ฒฐ ๋ผ ์žˆ๋‹ค๊ณ  ์ €์žฅ
            dfs(6)          #6์œผ๋กœ dfs ํƒ์ƒ‰
                                ↓
 def dfs(6):
    for i in graph[6]:      # i = 1, 3
        if visited[1] == 0: #๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋‹ˆ ํ˜„์žฌ 0์ด๋‹ค.
            visited[1] = 6  #1๋ฒˆ์€ 6๋ฒˆ๊ณผ ์—ฐ๊ฒฐ ๋ผ ์žˆ๋‹ค๊ณ  ์ €์žฅ
            dfs(1)          #1๋กœ dfs ํƒ์ƒ‰
                                ↓
 def dfs(1):
    for i in graph[1]:      # i = 6, 4
        if visited[4] == 0: #6์€ ์œ„์—์„œ 1๋กœ ์ €์žฅ๋ผ ์žˆ์–ด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ 4๋ฒˆ ํ™•์ธ
            visited[4] = 1  #4๋ฒˆ์€ 1๋ฒˆ๊ณผ ์—ฐ๊ฒฐ ๋ผ ์žˆ๋‹ค๊ณ  ์ €์žฅ
            dfs(4)          #4๋กœ dfs ํƒ์ƒ‰
                                .
                                .
                                .

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณ„์† ๋ฐฉ๋ฌธํ•ด ๊ฐ€๋ฉด์„œ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ์กฐ๊ฑด๋ฌธ์—์„œ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋ฉด์„œ ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค. ๋‹ค์Œ์€ ์ฝ”๋“œ ์ „์ฒด์ด๋‹ค.

 

โ€ป ์ฃผ์˜ํ•  ์ 

์ด ๋ฌธ์ œ์—์„œ ์ฃผ์˜ํ•  ๊ฒƒ์€ ๋ฐ˜๋ณต์ œํ•œ์ด๋‹ค. ๋ฐ˜๋ณต์ด ๊ธฐ๋ณธ์ ์œผ๋กœ 1000ํšŒ๋กœ ๋˜์–ด ์žˆ์–ด์„œ sys.setrecursionlimit(10**9) ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋ฐ˜๋ณต์ œํ•œ์„ ๋Š˜๋ ค์ค˜์•ผ ํ•œ๋‹ค.

Solution

import sys
input = sys.stdin.readline #์ž…๋ ฅ์„ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ
sys.setrecursionlimit(10**9) #๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋‚˜์„œ ์ถ”๊ฐ€

N = int(input()) #๋…ธ๋“œ ๊ฐœ์ˆ˜
graph = [[] for _ in range(N+1)] #์ธ์ ‘๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
visited = [0]*(N+1) #๋ฐฉ๋ฌธํ™•์ธ

#DFS ๊ตฌํ˜„
def dfs(x):
    for i in graph[x]: 
        if visited[i] == 0: #๋งŒ์•ฝ ํ•ด๋‹น ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
            visited[i] = x #ํ•ด๋‹น ๋…ธ๋“œ์— ์ •์ ์„ ์ €์žฅ
            dfs(i) #๊ทธ๋ฆฌ๊ณ  ์žฌ๊ท€

for _ in range(N-1):
    a, b = map(int, input().split())
    #๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๊ฑธ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์— ๊ฐ๊ฐ ์ €์žฅ
    graph[a].append(b)
    graph[b].append(a)

dfs(1)

#2๋ฒˆ ๋ฆฌ์ŠคํŠธ๋ถ€ํ„ฐ ๋‹ต ์ถœ๋ ฅ
for i in range(2, N+1):
    print(visited[i])
728x90