Bibi's DevLog ๐ค๐
[Swift] ๊ทธ๋ํ์ ํ์ ์๊ณ ๋ฆฌ์ฆ DFS/BFS (์ค๋ช ๋ฐ ๊ตฌํ ์์ ) ๋ณธ๋ฌธ
[Swift] ๊ทธ๋ํ์ ํ์ ์๊ณ ๋ฆฌ์ฆ DFS/BFS (์ค๋ช ๋ฐ ๊ตฌํ ์์ )
๋น๋น bibi 2023. 1. 13. 17:08[Swift] ๊ทธ๋ํ์ ํ์ ์๊ณ ๋ฆฌ์ฆ DFS/BFS
๊ฐ์ฅ ๋์์ด ๋ ๊ธ.. https://nareunhagae.tistory.com/56 ๐
'์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค' ์ฑ ๋ ํจ๊ป ์ฐธ๊ณ ํด ์์ฑํ์ต๋๋ค.
๊ทธ๋ํ Graph
๊ทธ๋ํ์์๋ ๋ชจ๋ ๊ฐ์ฒด๋ ์ ์ (๋ ธ๋)๋ก ๋ํ๋ด๊ณ , ๋ชจ๋ ๊ด๊ณ๋ ๊ฐ์ ์ผ๋ก ๋ํ๋ธ๋ค.
- ๋
ธ๋ Node / ์ ์ Vertex
- ๊ทธ๋ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๋จ์. (๊ทธ๋ฆผ์์์ ๋๊ทธ๋ผ๋ฏธ = ๋ ธ๋)
- ๋ ๋ ธ๋๊ฐ ์ธ์ ํ๋คadjacent : ๋ ๋ ธ๋๊ฐ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์์ ์๋ฏธ
- ๊ฐ์ Edge
- ๋ ธ๋ ์ฌ์ด๋ฅผ ์๋ ์ .
- ๊ทธ๋ํ ํ์ : ํ๋์ ๋ ธ๋๋ฅผ ์์์ผ๋ก ๋ค์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์ค 1์ฐจ์ ๋ฐฐ์ด, 2์ฐจ์ ๋ฐฐ์ด ํ์ ๋ฌธ์ ๋ฅผ ๊ทธ๋ํ ํํ๋ก ์๊ฐํ๋ฉด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋ค.
๊ทธ๋ํ ํํ
ํ๋ก๊ทธ๋๋ฐ์์ ๊ทธ๋ํ๋ฅผ ํํํ๋ ๋ฐฉ์.
์ธ์ ํ๋ ฌ Adjacency Matrix : 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ๊ฐ ๋ ธ๋์ ์ฐ๊ฒฐ๊ด๊ณ ํํ
- ์๋ฅผ ๋ค์ด ์ ๊ทธ๋ํ๋
[[0, 7, 5], [7, 0, Int.max], [5, Int.max, 0]]
๊ณผ ๊ฐ์ด ํํํ๋ค. - ์์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ 0, ๊ฐ์ ์ด ์์ผ๋ฉด ๊ฐ์ ์ ๊ฐ์ค์น, ๊ฐ์ ์ด ์์ผ๋ฉด ๋ฌดํ๊ณผ ๊ฐ์ด ์ ๋ต์ด ๋ ์ ์๋ ํฐ ๊ฐ์ ๋ฃ๋๋ค.
- ์ฅ์ : ํน์ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ๋ ๊ฒ์ด ๋น ๋ฅด๋ค.
- ๋จ์ : ๋ชจ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋ ธ๋ ๊ฐ์๊ฐ ๋ง์์๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถํ์ํ๊ฒ ๋ญ๋น๋๋ค.
- ์๋ฅผ ๋ค์ด ์ ๊ทธ๋ํ๋
์ธ์ ๋ฆฌ์คํธ Adjacency List : ๋ฐฐ์ด/๋ฆฌ์คํธ๋ก ๊ทธ๋ํ์ ๊ฐ ๋ ธ๋์ ์ฐ๊ฒฐ๊ด๊ณ ํํ
์ ๊ทธ๋ํ์์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๊ฐ ๋ ธ๋์ ๊ฐ์ด๋ผ๊ณ ์๊ฐํ์ ๋, ์๋์ ๊ฐ์ด ํํ ๊ฐ๋ฅ (2์ฐจ์๋ฐฐ์ด)
let graph = [ [1, 2], [0], [0] ]
์ ๊ทธ๋ํ์์
[๋ ธ๋ : [์ธ์ ๋ ธ๋]]
๋ก ์๊ฐํ์ ๋, ์๋์ ๊ฐ์ด ํํ ๊ฐ๋ฅ (๋์ ๋๋ฆฌ)
(๊ทธ๋ํ ํํ ๋ฐฉ์์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ ๊ฒ ๊ฐ๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์ด์ ๋ค๋ฅด๊ฒ ํํํด์ผ ํ ๋ฏ..)let graph: [Int: [Int]] = [ 0 : [1, 2], 1 : [0], 2 : [0] ]
์ฅ์ : ์ฐ๊ฒฐ๋ ์ ๋ณด๋ง์ ์ ์ฅํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค. ํน์ ๋ ธ๋์ ์ธ์ ํ ๋ชจ๋ ๋ ธ๋๋ฅผ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ์ ๋ค.
๋จ์ : ํน์ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ๋ ์๋๊ฐ ๋๋ฆฌ๋ค. - ์ฐ๊ฒฐ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํด์ผ ํ๋ฏ๋ก
DFS (Depth-First Search, ๊น์ด ์ฐ์ ํ์)
- ์์ ๋ ธ๋๋ถํฐ ํ์ํ๋ ๋ฐฉ์.
- ๋ฉ๋ฆฌ ์๋ ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ. (๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ)
- ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ : ํ ๋ฒ ์ฒ๋ฆฌํ ๋ ธ๋๋ฅผ ๋ค์ ์ฒ๋ฆฌํ์ง ์๋๋ก ์ฒดํฌํ๋ ๊ฒ.
- ์คํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค.
- ์ฌ๊ท๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๊ฒฐํ๊ฒ ๊ตฌํํ ์ ์๋ค.
O(n)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. (n
= ๋ฐ์ดํฐ์ ๊ฐ์)
๋์ ๊ณผ์
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ , ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค
- ์คํ์ ์ต์๋จ ๋
ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๊ฐ ์์ผ๋ฉด, ๊ทธ ์ธ์ ๋
ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋
ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- ๋ง์ฝ ์ธ์ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์ฌ๋ฌ ๊ฐ๋ฉด, ๊ฐ์ด ๋ฎ์ ๋ ธ๋๋ฅผ ๋จผ์ ์คํ์ ์ฝ์ ํ๋ค.
- ์ ๋ต์ ์ฐพ๊ฑฐ๋ ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์ํ ๋๊น์ง 2.๋ฅผ ๋ฐ๋ณตํ๋ค.
- ์ ๋ต์ ์ฐพ์๋ค๋ฉด ํ์์ ๋ฉ์ถ๋ค.
์๋ฅผ ๋ค์ด ์ ๊ทธ๋ํ๋ฅผ DFS๋ก ํ์ํ๋ค๋ฉด,
ํ์ ์์๋ 1 -> 2 -> 7 -> 6 -> 8 -> 3 -> 4 -> 5
๊ฐ ๋๋ค.
DFS ๊ตฌํ
let graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
var visited = Array(repeating: false, count: graph.count)
func dfs(graph: [[Int]], start: Int) {
visited[start] = true // ์์์
print(start, terminator: " ")
for i in graph[start] { // ์ผ์ชฝ๋ถํฐ ์ํ
if !visited[i] {
dfs(graph: graph, start: i)
}
}
}
// 1 2 7 6 8 3 4 5
BFS (Breadth First Search, ๋๋น ์ฐ์ ํ์)
- ์ธ์ ํ ๋ ธ๋๋ค์ ์ฐ์ ํ์ํ๋ ๋ฐฉ์.
- ๊ฐ๊น์ด ๋
ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ.
- 1950๋ ๋ฏธ๋ก๋ฅผ ํ์ถํ๋ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ธฐ ์ํด ํ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ํ๋ฅผ ์ฌ์ฉํด ๊ตฌํํ๋ ๊ฒ์ด ์ ์์ด๋ค.
- ์ธ์ ๋ ธ๋๋ฅผ ํ์ ๋ฃ์ผ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ ์ ์ ์ถ์ด ๋์ด ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๊ฒ ๋๋ค.
O(n)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. (n
= ๋ฐ์ดํฐ์ ๊ฐ์)- ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ ์๊ฐ์ DFS๋ณด๋ค BFS๊ฐ ๋น ๋ฅธ ํธ์ด๋ค.
๋์ ๊ณผ์
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ , ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋
ธ๋๋ฅผ ๊บผ๋ด, ํด๋น ๋
ธ๋์ ์ธ์ ๋
ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์
ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ๋ง์ฝ ์ธ์ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์ฌ๋ฌ ๊ฐ๋ฉด, ๊ฐ์ด ๋ฎ์ ๋ ธ๋ or ์ผ์ชฝ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ ์ฝ์ ํ๋ค.
- ์ ๋ต์ ์ฐพ๊ฑฐ๋, ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์ํ ๋๊น์ง 2.๋ฅผ ๋ฐ๋ณตํ๋ค.
- ์ ๋ต์ ์ฐพ์๋ค๋ฉด ํ์์ ๋ฉ์ถ๋ค.
์๋ฅผ ๋ค์ด DFS์ ๊ฐ์ ๊ทธ๋ํ๋ฅผ BFS๋ก ํ์ํ๋ค๋ฉด,
ํ์ ์์(ํ์ ๋ค์ด๊ฐ ์์)๋ 1 -> 2 -> 3 -> 8-> 7 -> 4 -> 5 -> 6
์ด ๋๋ค.
BFS ๊ตฌํ
let graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
func bfs(graph: [[Int]], start: Int) {
var queue = Queue<Int>()
var visited = Array(repeating: false, count: graph.count + 1)
queue.enqueue(start)
visited[start] = true
while !queue.isEmpty {
guard let key = queue.dequeue() else { return }
print(key, terminator: " ")
for i in graph[key] {
if !visited[i] {
queue.enqueue(i)
visited[i] = true
}
}
}
}
// 1 2 3 8 7 4 5 6
'ํ๋ก๊ทธ๋๋ฐ > Algorithm ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Hello Coding ์๊ณ ๋ฆฌ์ฆ] 4. ํต ์ ๋ ฌ (0) | 2021.07.01 |
---|---|
[Hello Coding ์๊ณ ๋ฆฌ์ฆ] 3์ฅ. ์ฌ๊ท (0) | 2021.06.30 |
[Hello Coding ์๊ณ ๋ฆฌ์ฆ] 2์ฅ. ์ ํ ์ ๋ ฌ (0) | 2021.06.30 |
[Hello Coding ์๊ณ ๋ฆฌ์ฆ] 1์ฅ. ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ (0) | 2021.06.28 |
ํ๋ก๊ทธ๋๋จธ์ค Lv1 - ์์ฐ์ ๋ค์ง์ด ๋ฐฐ์ด๋ก ๋ง๋ค๊ธฐ (0) | 2021.06.24 |