์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค:)
์ค๋์ ์ ๋ฒ ์๊ณ ๋ฆฌ์ฆ ํฌ์คํ (DFS)์ ์ด์ด BFS(๋๋น ์ฐ์ ํ์)์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค ํฉ๋๋ค!
์์ํ๊ธฐ ์ ์, ํ์ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ธ BFS๋ฅผ ์ดํดํ๋ ค๋ฉด ์ฐ์ ๊ทธ๋ํ์ ๋ํ ์ดํด๋ถํฐ ํ์ํ๋
ํน์ ๊ทธ๋ํ์ ๋ํด ์ ๋ชจ๋ฅด์ ๋ค๋ฉด ์๋ ๋งํฌ๋ก ๊ฑธ์ด๋ ์ด์ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!!
[Algorithm/Swift] DFS(๊น์ด ์ฐ์ ํ์) Swift๋ก ๊ตฌํํด๋ณด๊ธฐ
์์ฆ ๋ผ๋ ์ฑ ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๋ค์ ํ๋์ฉ ๋ฟ์๊ณ ์๋๋ฐ์, ์ด ์ฑ ์ด ํ์ด์ฌ ์ธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ช ๋์ด์์ด์ ๊ฐ๋ ์ ํ์ตํ๊ณ , ์์ ๋ ์ค์ ๋ฌธ์ ๋ค์ Swift์ธ์ด๋ก ํ์ดํด๋ณด๋ ๋ฐฉ์์ผ๋ก ์ฐจ๊ทผ
janechoi.tistory.com
BFS
BFS(Breadth First Search)๋ '๋๋น ์ฐ์ ํ์'์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.
์ฝ๊ฒ ๋งํด ๊ทธ๋ํ์ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค!
์ง๋ ํฌ์คํ ์์ ์ ๋ฆฌํ์๋ DFS๋ ๊ทธ๋ํ์ ๊ฐ์ฅ ๊น์ ๊ณณ, ์ฆ ๊ฐ์ฅ ๋ฉ๋ฆฌ ์๋ ๋ ธ๋๋ฅผ ์ฐ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด์๋๋ฐ์, BFS๋ ๊ทธ ๋ฐ๋๋ก ์ธ์ ํ ๋ ธ๋๋ค์ ์ฐ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ์์ ๋๋ค.

๋๋น ์ฐ์ ํ์ ๋ฐฉ์์ ํ์ ์์๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ณด์๋ฉด, ์์ ๊ฐ์ต๋๋ค!
1๋ฒ ๋ ธ๋๋ถํฐ ํ์์ ์์ํ๋ค๊ณ ํ๋ฉด ์ธ์ ํ ๋ ธ๋๋ค์ ํ์ํ๊ณ , ํ์์ด ๋๋๋ฉด ๋ฐฉ๊ธ ํ์ํ๋ ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ฅผ ํ์ํฉ๋๋ค.
์ด ๋, ํ์ฌ ๋ ธ๋์ ์ธ์ ๋ ธ๋๋ค ์ค์์ ์ด๋ค ๋ ธ๋๋ฅผ ๋จผ์ ํ์ํ๋์ง๋ ์ค์ํ์ง ์์ต๋๋ค.
์์ ์์์์ 2, 3๋ฒ์ด ๋ฐ๋์ด๋ ๋๊ณ , 4, 5, 6๋ฒ ๋ ธ๋๋ค ์ค ์ด๋ ๊ฒ ๋จผ์ ํ์ํด๋ ์๊ด์๋ค๋ ๊ฒ์ด์ฃ !
์ฆ, ๊ฐ์ ๋ ๋ฒจ์ ์๋ ๋ ธ๋๋ค ์ค์์๋ ์ด๋ ๊ฒ ๋จผ์ ํ์ํ๋๋๋ ์ค์ํ์ง ์๊ณ , ํ์ฌ ๋ ธ๋์์ ์ธ์ ํ ๊ฐ์ ๋ ๋ฒจ์ ์๋ ๋ ธ๋๋ค์ ํ์์ด ๋๋๋ฉด, ๋ค์ ๋ ๋ฒจ์ ๋ ธ๋๋ค์ ํ์์ผ๋ก ๋์ด๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!
BFS ๊ตฌํ๋ฐฉ๋ฒ
๊ทธ๋ ๋ค๋ฉด BFS๋ ์ค์ ๋ก ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์๊น์??
BFS๋ ๋ณดํต ์ ์ ์ ์ถ(FIFO) ๋ฐฉ์์ธ ํ(Queue) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํฉ๋๋ค!
์ธ์ ํ ๋ ธ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ ๋ฃ๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋จผ์ ๋ค์ด์จ ๊ฒ์ด ๋จผ์ ๋๊ฐ๊ฒ ๋์ด, ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์์ ์งํํ๊ฒ ๋ฉ๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ๋์ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
2. ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
3. 2๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
์ด์ ๊ฐ๋จํ ์์ ๋ก ์ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ BFS๋ฅผ ์ดํดํด๋ด ์๋ค!

์์ ๊ฐ์ ๊ตฌ์กฐ์ ๊ทธ๋ํ๋ฅผ 1๋ฒ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋๋ก ์ค์ ํ์ฌ BFS๋ฅผ ์ด์ฉํด ํ์์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ๋จผ์ ์์ ๋ ธ๋์ธ 1์ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
ํ์์ ๋ ธ๋ 1์ ๊บผ๋ด๊ณ ๋ค์์ผ๋ก 1๋ฒ ๋ ธ๋์ ์ธ์ ๋ ธ๋๋ค์ ํ์ ์ฝ์ ํด์ผํ๋๋ฐ,
์์ ๊ทธ๋ํ์์ 1๋ฒ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ์ธ์ ๋ ธ๋๋ 2, 3, 8 ์ด๋ ๊ฒ ์ธ ๊ฐ๊ฐ ์์ผ๋ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
๊ทธ ๋ค์์ผ๋ก, ์ฝ์ ํ ๋ ธ๋๋ค ์ค ๋จผ์ 2๋ฒ ๋ ธ๋๋ฅผ ๊บผ๋ด๊ณ ๋ฐฉ๋ฌธํ์ง ์์ 2๋ฒ ๋ ธ๋์ ์ธ์ ๋ ธ๋์ธ 7์ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
๋ค์์ 3๋ฒ ๋ ธ๋๋ฅผ ๊บผ๋ด์ฃผ๊ณ 3๋ฒ ๋ ธ๋์ ์ธ์ ๋ ธ๋๋ค์ธ 4, 5๋ฅผ ํ์ ์ฝ์ ํ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋๋ค.
์ด์ 8๋ฒ ๋ ธ๋๋ฅผ ๊บผ๋ด์ค ์ฐจ๋ก์ธ๋ฐ, 8๋ฒ ๋ ธ๋์ ์ธ์ ๋ ธ๋๋ค ์ค ๋ฐฉ๋ฌธํ์ง ์๋ ๋ ธ๋๋ ์์ผ๋ฏ๋ก ํ์ฌ ๋จ๊ณ์์ ์ฝ์ ํ ๋ ธ๋๋ ์๊ฒ ์ฃ ?
๊ทธ๋ ๋ค๋ฉด ๋ฐ๋ก ๋ค์ ๋ ธ๋์ธ 7๋ฒ ๋ ธ๋๋ฅผ ๊บผ๋ด ์ค๋๋ค. 7๋ฒ ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋์ธ 6์ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
์ด์ ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๊ฐ ์์ผ๋ฏ๋ก ํ์ ๋จ์์๋ ๋
ธ๋๋ฅผ ์ฐจ๋ก๋ก ๊บผ๋ด์ฃผ๋ฉด ํ์ ๊ณผ์ ์ด ๋๋๊ฒ ๋ฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋
ธ๋์ ํ์ ์์(=ํ์ ์ฝ์
๋ ์์)๋ 1 -> 2 -> 3 -> 8 -> 7-> 4 -> 5 -> 6 ์ด ๋ฉ๋๋ค.
์์ ๊ณผ์ ์ ์ฝ๋๋ก ๊ตฌํํ๋ค๋ฉด ์๋์ ๊ฐ์ด ๊ตฌํํ ์ ์์ต๋๋ค.
// 2์ฐจ์ ๋ฐฐ์ด
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) -> [Int] {
var visitedQueue = [Int]() // ๋ฐฉ๋ฌธํ ๋
ธ๋ ์ ์ฅํ๋ ๋ฐฐ์ด
var needVisitQueue = [start] // ๋ฐฉ๋ฌธํ ๋
ธ๋ ์ ์ฅํ๋ ๋ฐฐ์ด
while !needVisitQueue.isEmpty {
let node = needVisitQueue.removeFirst() // ํ๋ FIFO๋ก ๋์
if visitedQueue.contains(node) { continue } // ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ผ๋ฉด ์๋ ๊ณผ์ ๊ฑด๋ ๋
visitedQueue.append(node) // ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
needVisitQueue += graph[node]
}
return visitedQueue
}
// ์์ ๋
ธ๋๋ฅผ 1๋ก ์ค์ ํ์ฌ ํจ์ ํธ์ถ
bfs(graph, 1) // [1, 2, 3, 8, 7, 4, 5, 6]
[์ฐธ๊ณ ์๋ฃ]
Swift) ๋๋น ์ฐ์ ํ์(BFS) ๊ตฌํ ํด๋ณด๊ธฐ
์๋ ํ์ธ์ :) ์๋ค์ ๋๋ค!!! ์ด๋ฒ ํฌ์คํ ์์ ๋๋น ์ฐ์ ํ์(BFS)์ ๋ํด ์์๋ณด๋ ค๊ณ ํด์!!!! ๋จผ์ , ๋๋น ์ฐ์ ํ์์ด๋ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ธ๋ฐ, ๊ทธ๋ํ๋ฅผ ๋ชจ๋ฅด๋ฉด ์ดํดํ ์ ์์ผ๋
babbab2.tistory.com
<์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ>
์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ | ๋๋๋น - ๊ต๋ณด๋ฌธ๊ณ
์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ | IT ์ทจ์ค์์ด๋ผ๋ฉด ๋๊ตฌ๋ ์ ์ฌํ๊ณ ์ถ์ ์นด์นด์คใ์ผ์ฑ์ ์ใ๋ค์ด๋ฒใ๋ผ์ธ! ์ทจ์ ์ ์ฑ๊ณต ์ด์ ๋ ์๊ณ ๋ฆฌ์ฆ ์ธํฐ๋ทฐ์ ์๋ค!IT ์ทจ์ค์์ด๋ผ๋ฉด ๋๊ตฌ๋
product.kyobobook.co.kr