์๋ ํ์ธ์~
์ค๋์ ๋๋น ์ฐ์ ํ์์ ๋ํด์ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
๋๋น ์ฐ์ ํ์( BFS, Breadth-First Search )์ด๋?
๋๋น ์ฐ์ ํ์์ ์ธ์ ํ ๋ ธ๋๋ค์ ์ฐ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค.
์๋์ ์ด๋ฏธ์ง์ ์๋ ๊ทธ๋ํ์์ BFS๋ฅผ ์ฌ์ฉํ๋ฉด
์์ ๋งํ ๊ฒ์ฒ๋ผ ์ธ์ ํ ๋ ธ๋๋ถํฐ ํ์ธํ๊ฒ ๋๋๋ฐ
์๋ฅผ ๋ค์ด์ 1์ ๊ฐ์ฅ ๋จผ์ ํ์ํ๊ณ ๋๋ฉด ์ธ์ ํ 8, 5, 2๋ฅผ ์์๋๋ก ํ์ํฉ๋๋ค.
๋ค์์ 6๋ถํฐ ์์ํด์ 9๊น์ง ํ์์ ์งํํ๊ฒ ์ฃ ?
์ฆ, ๊ฐ์ ๋ ๋ฒจ์ ์๋ ๋ ธ๋๋ค๋ถํฐ ํ์์ ํ๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ 8๋ถํฐ ์์ํ๋ 2๋ถํฐ ์์ํ ๋ ์์๋ ์ค์ํ์ง ์์ต๋๋ค.
์ค์ํ ์ ์ ๊ฐ์ ๋ ๋ฒจ์ ์๋ ๋ ธ๋๋ฅผ ์ ๋ถ ํ์ํ๊ณ ๋ค์ ๋ ๋ฒจ๋ก ๋์ด๊ฐ๋ค๋ ๊ฒ์ ๋๋ค.
โ๏ธ Swift๋ก ๊ตฌํํด ๋ณด๊ธฐ
์์ ์ด๋ฏธ์ง์ ์๋ ๊ทธ๋ํ๋ฅผ ํตํด BFS๋ฅผ ๊ตฌํํด ๋ณด์.
1. ํ( Queue )
BSF๋ ๋ณดํต ๋ ๊ฐ์ ํ๋ก ๊ตฌํํฉ๋๋ค.
ํ๋ ์ง๋ ํฌ์คํ ์์ ๋ค๋ค์ผ๋ ์ฌ๊ธฐ์ ์ฐธ๊ณ ํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
(1) ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ์ ์ฅํ๋ ํ
(2) ๋ฐฉ๋ฌธํด์ผ ํ๋ ๋ ธ๋๋ฅผ ์ ์ฅํ๋ ํ
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]
]
2. BFS
์ค๋ช ์ ์ฃผ์์ผ๋ก ํ๊ฒ ์ต๋๋ค.
func breadthFirstSearch(graph: [String: [Int]], start: String) -> [String] {
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ์ ์ฅํ๋ ํ
var visitedQueue: [String] = []
// ๋ฐฉ๋ฌธํด์ผํ๋ ๋
ธ๋๋ฅผ ์ ์ฅํ๋ ํ
var needVisitQueue: [String] = [start]
while !needVisitQueue.isEmpty {
let node: String = String(needVisitQueue.removeFirst())
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ ๋
ธ๋๋ผ๋ฉด continue ์ฒ๋ฆฌ
if visitedQueue.contains(node) {
continue
}
visitedQueue.append(node)
// ์ธ์ ํ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ ๊ณผ์ ์
๋๋ค.
// ๋ง์ฝ ๊ฐ์ฅ ์ฒ์์ "1"์ด ๋ค์ด์จ๋ค๋ฉด 1๊ณผ ์ธ์ ํ ๋ฆฌ์คํธ๋ฅผ needVisitQueue์ ์ถ๊ฐํ๋ ๊ณผ์
needVisitQueue += graph[node].map{ $0.map { String($0) } } ?? []
}
return visitedQueue
}
print(breadthFirstSearch(graph: graph, start: "1"))
// ["1", "8", "5", "2", "6", "4", "3", "9", "10", "7"]
์ฌ๊ธฐ๊น์ง ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
๊ทธ๋ผ ์๋ ~ ๐๐ป ๐๐ป ๐๐ป
'์๊ณ ๋ฆฌ์ฆ > ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] DFS(Depth-First Search, ๊น์ด ์ฐ์ ํ์)์ ๋ํด์ ์์๋ณด์ (0) | 2023.02.05 |
---|