DFS(๊น์ด ์ฐ์ ํ์)
1. DFS(Depth First Search)๋?
๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ํ๋ ๋
ธ๋(Node)์ ๊ฐ์ (Edge)๋ก ํํ๋๋ฉฐ ๋
ธ๋๋ ์ ์ (Vertex)๋ผ๊ณ ๋ ํ๋ค.
๊ทธ๋ํ๋ ์ธ์ ๋ฆฌ์คํธ(๋ฆฌ์คํธ๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ๊ด๊ณ ํํ)์ ์ธ์ ํ๋ ฌ(2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํ)๋ก ํํํ ์ ์๋ค.
DFS(๊น์ด์ฐ์ ํ์)๋ ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋์๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
1. ํ์ ์์ ๋
ธ๋๋ฅผ ์คํ์ ์ฝ์
ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
2. ์คํ์ ์ต์๋จ ๋
ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ธ์ ๋
ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋
ธ๋๋ฅผ ๊บผ๋ธ๋ค.
3. 2๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
2. ์์ ์ฝ๋
def dfs(graph, v, visited):
visited[v] = True # ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
print(v, end=' ')
for i in graph[v]: # ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ (graph[v]์ v์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ ๋ณด๊ฐ ๋ค์ด์์)
if not visited[i]: # ๋ง์ฝ i๊ฐ ๋ฐฉ๋ฌธ์ด True๊ฐ ์๋๋ผ๋ฉด (๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด)
dfs(graph, i, visited) # dfs๋ก graph[v]์ i ๋
ธ๋ dfs์ฒ๋ฆฌ (๊ณ์ ๊น์ด์ง)
n = int(input()) # ๋
ธ๋์ ๊ฐ์
graph = [[] * (n + 1)]
for _ in range(1, n+1):
array = list(map(int, input().split()))
graph.append(array)
visited = [False] * (n + 1) #[0]์ ์ฌ์ฉ x
dfs(graph, 1, visited) # 1๋ถํฐ ๊น์ด์ฐ์ ํ์ ์์
3. ์์ ์
์ถ๋ ฅ
๊ฐ์ ํ์ ํด๋นํ์ index์ ์ฐ๊ฒฐ๋๊ฒ์ด๋ค.(๋
ธ๋1์ ๋
ธ๋2,๋
ธ๋3,๋
ธ๋8๊ณผ ์ฐ๊ฒฐ)
์
๋ ฅ :
(๋
ธ๋1) 2 3 8
(๋
ธ๋2) 1 7
(๋
ธ๋3) 1 4 5
(๋
ธ๋4) 3 5
(๋
ธ๋5) 3 4
(๋
ธ๋6) 7
(๋
ธ๋7) 2 6 8
(๋
ธ๋8) 1 7
์ถ๋ ฅ :
๋
ธ๋ 1์์ dfs๋ฅผ ๊ตฌํ๋ฉด
output = 1 2 7 6 8 3 4 5