์์ฆ <์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค> ๋ผ๋ ์ฑ ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๋ค์ ํ๋์ฉ ๋ฟ์๊ณ ์๋๋ฐ์,
์ด ์ฑ ์ด ํ์ด์ฌ ์ธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ช ๋์ด์์ด์ ๊ฐ๋ ์ ํ์ตํ๊ณ , ์์ ๋ ์ค์ ๋ฌธ์ ๋ค์ Swift์ธ์ด๋ก ํ์ดํด๋ณด๋ ๋ฐฉ์์ผ๋ก ์ฐจ๊ทผ์ฐจ๊ทผ ๊ณต๋ถํด๊ฐ๊ณ ์์ต๋๋ค! ๊ฐ๋ ์ ๊ณต๋ถํ๊ณ Swift ์ธ์ด๋ก ๋ฐ๊ฟ๋ณด๋ ๊ณผ์ ์ ์ ๋ฆฌํด๋๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ํ๋์ฉ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
์ค๋์ ์๊ณ ๋ฆฌ์ฆ์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ๋ค ์ค ํ๋์ธ ํ์ ์๊ณ ๋ฆฌ์ฆ, ๊ทธ ์ค์์๋ DFS(๊น์ด ์ฐ์ ํ์)์ ๊ฐ๋ ์ ์ ๋ฆฌํด๋ณด๊ณ , ์ฑ ์ ๊ฐ๋จํ ์์ ๋ฅผ Swift ์ธ์ด๋ก ๋ฐ๊ฟ์ DFS๋ฅผ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
DFS
DFS(Depth-First Search)๋ ๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ๊ทธ๋ํ๋ ์ด๋ค ๊ตฌ์กฐ์ธ์ง ๋ถํฐ ์์์ผ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ ์ ์์ ๊ฒ ๊ฐ๋ค์!
๊ทธ๋ํ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ ๋ถํฐ ๊ฐ๋จํ ์ค๋ช ํ๊ณ ๋ค์ DFS ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค!!
๊ทธ๋ํ
๊ทธ๋ํ๋ ๋ ธ๋(Node)์ ๊ฐ์ (Edge)์ผ๋ก ํํ๋๋ฉฐ ์ด๋ ๋ ธ๋๋ฅผ ์ ์ (Vertex)์ด๋ผ๊ณ ๋ ๋งํฉ๋๋ค.
๊ทธ๋ํ๋ฅผ ํ์ํ๋ค๋ ๊ฒ์ ํ๋์ ๋ ธ๋๋ฅผ ์์์ผ๋ก ๋ค์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
๋ ๋ ธ๋๊ฐ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด '๋ ๋ ธ๋๋ ์ธ์ ํ๋ค'๋ผ๊ณ ํํํฉ๋๋ค.
์์ ๊ทธ๋ฆผ์์ 1๋ฒ ๋ ธ๋, 2๋ฒ ๋ ธ๋๋ 0๋ฒ ๋ ธ๋์ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด์๊ธฐ ๋๋ฌธ์ 0๋ฒ ๋ ธ๋์ 1๋ฒ ๋ ธ๋, ๊ทธ๋ฆฌ๊ณ 0๋ฒ ๋ ธ๋์ 2๋ฒ ๋ ธ๋๋ ์ธ์ ํ ๋ ธ๋์ ๋๋ค. ํ์ง๋ง, 1๋ฒ ๋ ธ๋์ 2๋ฒ ๋ ธ๋๋ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋ ธ๋๋ ์ธ์ ํ ๋ ธ๋๊ฐ ์๋๋๋ค.
์ด๋ฌํ ๊ทธ๋ํ๋ฅผ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ธ์ ํ๋ ฌ, ์ธ์ ๋ฆฌ์คํธ ์ด๋ ๊ฒ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ํํํ ์ ์์ต๋๋ค.
- ์ธ์ ํ๋ ฌ(Adjacency Matrix): 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
- ์ธ์ ๋ฆฌ์คํธ(Adjacency List): ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
1. ์ธ์ ํ๋ ฌ
์ธ์ ํ๋ ฌ ๋ฐฉ์์ 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํํ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฉ์์ ๋๋ค.
๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด์๋ค๋ฉด 1, ์ฐ๊ฒฐ๋์ด์์ง ์๋ค๋ฉด(=์ธ์ ํ ๋ ธ๋๊ฐ ์๋๋ผ๋ฉด) 0์ผ๋ก ํ๊ธฐํฉ๋๋ค.
(๊ฐ์ค์น ๊ทธ๋ํ์ ๊ฒฝ์ฐ 1 ๋์ ๊ฐ์ค์น ๊ฐ(=๊ฑฐ๋ฆฌ)์ผ๋ก ํ๊ธฐํ๊ณ ์ฐ๊ฒฐ๋์ด์์ง ์์ ๋ ธ๋์ ๊ฒฝ์ฐ ๋ฌดํ์ผ๋ก ํ๊ธฐํ ์ ์์ต๋๋ค.)
์ธ์ ํ๋ ฌ ๋ฐฉ์์ ์ฅ์ :
- ์ง๊ด์ ์ด๋ฉฐ ์ฝ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
- 2์ฐจ์ ๋ฐฐ์ด ์์ ๋ชจ๋ ๋ ธ๋๋ค์ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ๋๋ฌธ์, ๋ ๋ ธ๋์ ๋ํ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์กฐํํ ๋ O(1)์ด๋ฉด ๊ฐ๋ฅํฉ๋๋ค.
์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋จ์ :
- ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋ชจ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋ ธ๋ ๊ฐ์๊ฐ ๋ง์์๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถํ์ํ๊ฒ ๋ญ๋น๋ฉ๋๋ค.
- ๋ชจ๋ ๋ ธ๋์ ๋ํ ๊ฐ์ ์ ๋ณด๋ฅผ ๋์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ O(n²)์ ์๊ฐ ๋ณต์ก๋๊ฐ ์์๋ฉ๋๋ค.
2. ์ธ์ ๋ฆฌ์คํธ
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์์๋ ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ชจ๋ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐํ์ฌ ์ ์ฅํฉ๋๋ค.
์ฃผ๋ก ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋ง๋ค์ด์ ํด๋น ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด์๋ ๋ชจ๋ ๋ ธ๋๋ค์ ์์๋ก ๊ฐ์ง๋ ๋ฐฐ์ด๋ก ํํํฉ๋๋ค.
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ฅ์ :
- ํ์ํ ์ ๋ณด๋ง ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
- ๋ ธ๋๋ค์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ํ์ํ ๋ O(n)์ ์๊ฐ์ด๋ฉด ๊ฐ๋ฅํฉ๋๋ค. (n์ ๊ฐ์ ๊ฐฏ์)
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ๋จ์ :
- ์ธ์ ํ๋ ฌ์ ๋นํด ๊ตฌํ์ด ๋น๊ต์ ์ด๋ ต์ต๋๋ค.
- ํน์ ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์๋์ง ํ์ธํ๋ ๊ณผ์ ์ด ์ธ์ ํ๋ ฌ์ ๋นํด ๋น๊ต์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฝ๋๋ค.
์ด ์ ๋๋ฉด ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๊ธฐ ์ํด ํ์ํ ๊ทธ๋ํ์ ๊ธฐ๋ณธ์ ์ธ ์ง์์ ์ ๋ฆฌ๊ฐ ๋ ๊ฒ ๊ฐ๋ค์.
๊ทธ๋ํ์ ๋ํด ์ข ๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด ์๋์ ๋งํฌ์ ์ ์ ๋ฆฌ๊ฐ ๋์ด์์ด์ ์ฐธ๊ณ ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!
์ด์ ๋ค์ DFS๋ก ๋์์์!
DFS๋ ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ์์ฃ ??
๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋ ๊ฒ์ธ์ง ์์๋ด ์๋ค.
DFS๋ ํน์ ํ ๊ฒฝ๋ก๋ก ํ์ํ๋ค๊ฐ ํน์ ํ ์ํฉ์์ ์ต๋ํ ๊น์์ด ๋ค์ด๊ฐ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ๋ค์ ๋์๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
DFS๋ ์คํ(stack) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ฉฐ ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ (append)ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
2. ์คํ์ ์ต์๋จ ๋
ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์
์ ๋
ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ธ์ ๋
ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๊ฐ ๋์ด์ ์๋ค๋ฉด ์คํ์์ ์ต์๋จ ๋
ธ๋๋ฅผ ๊บผ๋
๋๋ค.
3. 2๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
์ด์ ๊ฐ๋จํ ์์ ๋ก ์ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ DFS๋ฅผ ์ดํดํด๋ด ์๋ค!
์์ ๊ฐ์ ๊ตฌ์กฐ์ ๊ทธ๋ํ๋ฅผ 1๋ฒ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋๋ก ์ค์ ํ์ฌ DFS๋ฅผ ์ด์ฉํด ํ์์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ ์ผ ๋จผ์ ์์ ๋ ธ๋์ธ 1์ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์คํ์ ์ต์๋จ ๋ ธ๋๋ 1์ด ๋ฉ๋๋ค. ์ต์๋จ ๋ ธ๋์ธ 1์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๋ 2, 3, 8 ์ ๋๋ค.
์ด ์ค ๊ฐ์ฅ ์์ ๋ ธ๋์ธ 2๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
์๋กญ๊ฒ ์คํ์ ์ต์๋จ ๋ ธ๋๊ฐ ๋ 2์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๋ 7์ ๋๋ค. ๋ฐ๋ผ์ 7์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํฉ๋๋ค.
์คํ์ ์ต์๋จ ๋ ธ๋์ธ 7์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๋ 6๊ณผ 8์ ๋๋ค. ์ด ์ค ์์ 6์ ๋จผ์ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
์คํ์ ์ต์๋จ ๋ ธ๋์ธ 6์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๋ ์๊ธฐ ๋๋ฌธ์ ์คํ์์ 6์ ๊บผ๋ ๋๋ค.
๋๋ค์ ์ต์๋จ ๋ ธ๋๊ฐ ๋ 7์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๋ก๋ ์ด์ 8์ด ๋จ์์ต๋๋ค. ๋ฐ๋ผ์ 8์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ธ๋์ ํ์ ์์๋
1 -> 2 -> 7 -> 6 -> 8 -> 3 -> 4 -> 5 ๊ฐ ๋ฉ๋๋ค.
์ ๊ณผ์ ์ ์ค์ ์ฝ๋๋ก ๊ตฌํ์ ํ๋ค๋ฉด ๋๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ทํจ์๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
Swift ์ฝ๋๋ก ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
// 2์ฐจ์ ๋ฐฐ์ด
let graph = [[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]]
// ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ ์ฅํ๋ ๋ฐฐ์ด (์ฒ์์๋ ๋ชจ๋ false๋ก ์ด๊ธฐํ)
var visited = Array.init(repeating: false, count: graph.count)
func dfs(_ start: Int) {
visited[start] = true // ์์ ๋
ธ๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
print(start, terminator: " ")
for i in graph[start] {
if !visited[i] {
dfs(i)
}
}
}
// ์์ ๋
ธ๋๋ฅผ 1๋ก ์ค์ ํ์ฌ ํจ์ ํธ์ถ
dfs(1) // 1 2 7 6 8 3 4 5
[์ฐธ๊ณ ์๋ฃ]
<์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ>