์๋ ํ์ธ์~
์ค๋์ ๊น์ด ์ฐ์ ํ์์ ๋ํด์ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
๊น์ด ์ฐ์ ํ์( DFS, Depth-First Search )์ด๋?
๊น์ด ์ฐ์ ํ์์ ํ์ํ๊ณ ์ ํ๋ ๋ ธ๋๋ค์ ์์ ๋ ธ๋๋ถํฐ ์ฐ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค.
์๋์ ์ด๋ฏธ์ง์ ์๋ ๊ทธ๋ํ์์ BFS๋ฅผ ์ฌ์ฉํ๋ฉด
์์ ๋งํ ๊ฒ์ฒ๋ผ ์์ ๋ ธ๋๋ถํฐ ํ์ธํ๋๋ฐ
์๋ฅผ ๋ค์ด์ 1์ ๊ฐ์ฅ ๋จผ์ ํ์ํ๊ณ ๋๋ฉด 8, 6, 10, 7, 4 ... ์ ์์๋๋ก ํ์ํ๊ฒ ๋ฉ๋๋ค.
์ฆ, ํ์ํ๊ณ ์ํ๋ ๋ ธ๋์ ์์ ๋ ธ๋๋ค์ ๋ชจ๋ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
BFS์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๊ธฐ์ 8๋ถํฐ ์์ํ๋ 2๋ถํฐ ์์ํ๋ ์์๋ ์ค์ํ์ง ์์ต๋๋ค.
์ค์ํ ์ ์ ์์ ๋ ธ๋๋ค์ ์ฐ์ ํ์ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
โ๏ธ Swift๋ก ๊ตฌํํด ๋ณด๊ธฐ
์์ ์ด๋ฏธ์ง์ ์๋ ๊ทธ๋ํ๋ฅผ ํตํด DFS๋ฅผ ๊ตฌํํด ๋ณด์.
1. ํ( Queue )
DSF๋ ๋ณดํต ํ ๊ฐ์ ํ์ ํ ๊ฐ์ ์คํ์ผ๋ก ๊ตฌํํฉ๋๋ค.
(1) ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ์ ์ฅํ๋ ํ
(2) ๋ฐฉ๋ฌธํด์ผ ํ๋ ๋ ธ๋๋ฅผ ์ ์ฅํ๋ ์คํ
BFS์์๋ ๋๊ฐ์ ํ๋ฅผ ์ฌ์ฉํ๋๋ฐ
DFS์์ ์คํ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ฐ๋จํฉ๋๋ค.
BFS์์๋ Queue์ FIFO ์ฑ์ง์ ์ด์ฉํด ์ธ์ ๋ฆฌ์คํธ์์ depth๊ฐ ๊ฐ์ฅ ๋ฎ์ ๋ ธ๋๋ฅผ ๊ฐ์ง๊ณ ์ฌ ์ ์๋ ๊ฒ์ด๊ณ
DFS์์๋ Stack์ LIFO ์ฑ์ง์ ์ด์ฉํด ์ธ์ ๋ฆฌ์คํธ์์ depth๊ฐ ๊ฐ์ฅ ๊น์ ๋ ธ๋๋ฅผ ๊ฐ์ง๊ณ ์ฌ ์ ์๋ ๊ฒ์ ๋๋ค.
์์ ์ด๋ฏธ์ง๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
"1"์ ๊ฐ์ฅ ๋จผ์ ์ ํํด ํ์ํ๋ฉด
1. BFS
visitQueue | needVisitQueue | |
๋ฃจํ 1 | ["1"] | ["8", "5", "2"] |
๋ฃจํ 2 | ["1", "8"] | ["2", "5", "6", "4", "3"] |
๋ฃจํ 3 | ["1", "8", "5"] | ["2", "6", "4", "3"] |
์์ ๊ฐ์ด ํ๋ฅผ ์ด์ฉํ๊ฒ๋๋ฉด ๊ฐ์ depth๋ถํฐ ํ์์ด ๊ฐ๋ฅํด์ง๋๋ค.
2. DFS
visitQueue | needVisitStack | |
๋ฃจํ 1 | ["1"] | ["2", "5", "8"] |
๋ฃจํ 2 | ["1", "8"] | ["2", "5", "3", "4", "6"] |
๋ฃจํ 3 | ["1", "8", "6"] | ["2", "5", "3", "4", "7", "10"] |
์์ ๊ฐ์ด ์คํ์ ์ฌ์ฉํ๋ฉด depth๊ฐ ๋ ๊น์ ๋ ธ๋๋ถํฐ ํ์์ด ๊ฐ๋ฅํด์ง๋๋ค.
ํ์ ์คํ์ ์ง๋ ํฌ์คํ ์์ ๋ค๋ค์ผ๋ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
[ ํ(Queue) ]
[ ์คํ(Stack) ]
2. ์ธ์ ๋ฆฌ์คํธ( Adjacency List )
๊ทธ๋ํ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์๋
์ธ์ ํ๋ ฌ ๊ทธ๋ํ์ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์ ๋ ๊ฐ์ง๊ฐ ์กด์ฌํฉ๋๋ค.
์ฌ๊ธฐ์๋ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ฌ์ฉํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ธ์ ๋ฆฌ์คํธ๋ ๋ง ๊ทธ๋๋ก ์ธ์ ํ ๋ ธ๋๋ค์ ๋ฆฌ์คํธ๋ก ๋์ดํ ๊ฒ์ ๋งํฉ๋๋ค.
1 | 8 | 5 | 2 | |
8 | 1 | 6 | 4 | 3 |
5 | 1 | |||
2 | 1 | 9 | ||
6 | 8 | 10 | 7 | |
4 | 8 | |||
3 | 8 | |||
9 | 2 | |||
10 | 6 | |||
7 | 6 |
์์ ๊ฐ๋ค์ ๋์ ๋๋ฆฌ๋ก ๊ตฌํํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
let graph: [String: [Int]] = [
"1" : [8, 5, 2],
"8" : [1, 6, 4, 3],
"5" : [1],
"2" : [1, 9],
"6" : [8, 10, 7],
"4" : [8],
"3" : [8],
"9" : [2],
"10" : [6],
"7" : [6]
]
3. DFS
์ค๋ช ์ ์ฃผ์์ผ๋ก ํ๊ฒ ์ต๋๋ค.
func depthFirstSearch(graph: [String: [Int]], start: String) -> [String] {
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ์ ์ฅํ๋ ํ
var visitedQueue: [String] = []
// ๋ฐฉ๋ฌธํด์ผํ๋ ๋
ธ๋๋ฅผ ์ ์ฅํ๋ ์คํ
var needVisitStack: [String] = [start]
while !needVisitStack.isEmpty {
let node: String = String(needVisitStack.removeLast())
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ ๋
ธ๋๋ผ๋ฉด continue ์ฒ๋ฆฌ
if visitedQueue.contains(node) {
continue
}
visitedQueue.append(node)
// ์ธ์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ ๊ณผ์
// ๋ง์ฝ ๊ฐ์ฅ ์ฒ์์ "1"์ด ๋ค์ด์จ๋ค๋ฉด 1๊ณผ ์ธ์ ํ ๋ฆฌ์คํธ๋ฅผ needVisitStack์ ์ถ๊ฐํ๋ ๊ณผ์
needVisitStack += graph[node].map{ $0.map { String($0) } }?.reversed() ?? []
}
return visitedQueue
}
print(depthFirstSearch(graph: graph, start: "1"))
// ["1", "8", "6", "10", "7", "4", "3", "5", "2", "9"]
์ฌ๊ธฐ๊น์ง ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
๊ทธ๋ผ ์ด๋ง ๐๐ป ๐๐ป ๐๐ป
'์๊ณ ๋ฆฌ์ฆ > ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] BFS(Breadth-First Search, ๋๋น ์ฐ์ ํ์)์ ๋ํด์ ์์๋ณด์ (0) | 2023.02.02 |
---|