Problem Solving/[ํ•ญํ•ด99] TIL

99ํด๋Ÿฝ ์ฝ”ํ…Œ ์Šคํ„ฐ๋”” 4์ผ์ฐจ TIL / DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

geum 2024. 10. 31. 18:37

โœ๏ธ ๋ฌธ์ œ

https://www.acmicpc.net/problem/24479

 

์˜ค๋Š˜๋„ ์„œ์ค€์ด๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS) ์ˆ˜์—… ์กฐ๊ต๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ์•„๋น ๊ฐ€ ์ˆ˜์—…ํ•œ ๋‚ด์šฉ์„ ํ•™์ƒ๋“ค์ด ์ž˜ ์ดํ•ดํ–ˆ๋Š”์ง€ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•ด๋ณด์ž.

N๊ฐœ์˜ ์ •์ ๊ณผ M๊ฐœ์˜ ๊ฐ„์„ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(undirected graph)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ •์  ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ์ด๊ณ  ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋Š” 1์ด๋‹ค. ์ •์  R์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๊ฒฝ์šฐ ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•˜์ž.

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ์˜์‚ฌ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ธ์ ‘ ์ •์ ์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค.

 

๐Ÿค– ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

 

๐Ÿง ๋‚œ์ด๋„/์†Œ์š” ์‹œ๊ฐ„

โœ… ๋‚œ์ด๋„: solved.ac ๊ธฐ์ค€ S2

โœ… ์†Œ์š” ์‹œ๊ฐ„: 30๋ถ„

โœ… ๊ถŒ์žฅ ์‹œ๊ฐ„: 45๋ถ„

 

S2๋ผ๊ณ  ํ‘œ๊ธฐ๋œ ๊ฒƒ ์น˜๊ณ ๋Š” ์กฐ๊ธˆ ์‰ฌ์šด ๊ฒƒ ๊ฐ™๊ธด ํ•œ๋ฐ ์Šคํ„ฐ๋”” ์‹œ์ž‘ํ•˜๊ณ  ์ฒ˜์Œ์œผ๋กœ ๊ถŒ์žฅ ์‹œ๊ฐ„ ์•ˆ์— ํ‘ผ ๋ฌธ์ œ๋‹ค ๋ฟŒ-๋“ฏ

 

๐Ÿ’ก ํ’€์ด

1) ๋ฌธ์ œ ์œ ํ˜• ํŒŒ์•…

์ œ๋ชฉ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์˜์‚ฌ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ฐฉ๋ฌธ ์ˆœ์„œ ์ฒ˜๋ฆฌ ๋ง๊ณ  ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ์˜์‚ฌ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธฐ๋ฉด ๋œ๋‹ค.

 

2) ์•„์ด๋””์–ด ํ๋ฆ„

โ‘  DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ณธ ํ‹€ ๊ตฌ์„ฑ

์˜์‚ฌ ์ฝ”๋“œ์— ์ ํžŒ๋Œ€๋กœ ํ˜„์žฌ ์ •์ ์ธ R์„ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ํ•ด์ค€ ํ›„ R๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉด์„œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์ด์šฉํ•ด ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๋ฉฐ ํƒ์ƒ‰ํ•œ๋‹ค.

 

๋ฌธ์ œ์—์„œ '์ธ์ ‘ ์ •์ ์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค'๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— sorted ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•ด์ฃผ๊ณ  ํƒ์ƒ‰์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

 

โ‘ก โญํ•ต์‹ฌ - ๋ฐฉ๋ฌธ ์ˆœ์„œ ๊ธฐ๋กโญ

์ฒ˜์Œ์—๋Š” ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์•ˆ ์ฝ๊ณ  ๊ทธ๋ƒฅ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ ๊ทธ ์ž์ฒด๋ฅผ ์ถœ๋ ฅํ•˜๋Š”์ง€ ์•Œ์•˜๋‹ค. ๋ฌธ์ œ๋ฅผ ๊ผผ๊ผผํžˆ ์ฝ์ž ใ…ˆใ…”ใ…‚rz . . โ˜…

 

์ฒซ ๋ฒˆ์งธ ์ •์ ์˜ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋Š” ๋ฌด์กฐ๊ฑด 1์ด๋ผ๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ ๊ธฐ๋ก์šฉ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐ๊ฐ’์€ 1๋กœ ์„ค์ •ํ–ˆ๋‹ค. ์ˆœ์„œ ๊ธฐ๋ก์šฉ ๋ณ€์ˆ˜ ๊ฐ’์„ vistied ๋ฐฐ์—ด์˜ R๋ฒˆ์งธ์— ์ €์žฅํ•ด์ฃผ๊ณ , ๊ฐ’์€ ๊ณ„์† 1์”ฉ ์ฆ๊ฐ€์‹œ์ผœ ๋‚˜๊ฐ„๋‹ค.

 

3-1) ๊ตฌํ˜„: ์‹คํŒจ ์ฝ”๋“œ

import sys

sys.setrecursionlimit(10**6)

input = sys.stdin.readline

N, M, R = map(int, input().split())

visited = [False]*(N+1)

graph = {k: [] for k in range(1, N+1)}

for _ in range(M):
    u, v = map(int, input().split())
    
    graph[u].append(v)
    graph[v].append(u)

def DFS(V, E, R):
    visited[R] = True
    
    print(R)
    
    for node in sorted(graph[R]):
        if not visited[node]:
            DFS(V, E, node)
        
    return 0

print(DFS(N, M, R))

 

์ด๊ฒŒ ์ง„์ • ์ „๊ณต์ž์˜ ์ฝ”๋“œ? ๋งˆ์ง€๋ง‰์— DFS(N, M, R)์„ print๋ฌธ์œผ๋กœ ๊ฐ์‹ธ ๋†“๊ณ  ์™œ ๋๋‚  ๋•Œ None์ด ๋‚˜์˜ค์ง€? ์ด๋Ÿฌ๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ 0 ๋‚˜์˜ค๊ฒŒ ํ•˜๋ ค๊ณ  return ์ถ”๊ฐ€ํ•ด๋‘”๊ฑด๋ฐ ๋ฐ”๋กœ ์ •์‹  ์ฐจ๋ ค์„œ ๋‹คํ–‰์ด๋‹ค.

 

3-2) ๊ตฌํ˜„: ์ •๋‹ต ์ฝ”๋“œ

import sys

sys.setrecursionlimit(10**6)  # RecursionError ๋ฐฉ์ง€

input = sys.stdin.readline

N, M, R = map(int, input().split())

visited = [0]*(N+1)

graph = {k: [] for k in range(1, N+1)}

for _ in range(M):
    u, v = map(int, input().split())
    
    graph[u].append(v)
    graph[v].append(u)

visit_order = 1

def DFS(V, E, R):
    global visit_order
    
    visited[R] = visit_order

    visit_order += 1
    
    for node in sorted(graph[R]):
        if visited[node] == 0:
            DFS(V, E, node)
            
DFS(N, M, R)

for v in visited[1:]:
    print(v)

 

์‹คํŒจ ์ฝ”๋“œ์—์„œ ๋ฌธ์ œ์˜€๋˜ ๋ถ€๋ถ„์„ ํŒŒ์•…ํ•œ ํ›„ ์ˆ˜์ •ํ•˜๋‹ˆ๊นŒ ๋ฐ”๋กœ ํ†ต๊ณผํ–ˆ๋‹ค.

 

4) ์–ด๋ ค์› ๋˜ ์ /๋ฐฐ์šด ์ 

๐Ÿšจ ์–ด๋ ค์› ๋˜ ์ 

  • ์—†์Œ. ๋ฌธ์ œ๋งŒ ์ข€ ๋˜‘๋ฐ”๋กœ ์ฝ์ž

โ— ๋ฐฐ์šด ์ 

  • ์žฌ๊ท€๋ฅผ ์“ฐ๋Š” ๋ฌธ์ œ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ print๋ฌธ ์œ„์น˜ ์„ ์ •์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ