์ด ๊ธ์ ๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์์ฑ๋ ๊ธ์์ ๋ฐํ๋๋ค.
์์ธํ ๋ด์ฉ์ https://babbab2.tistory.com/107 ์ด๊ณณ์ ํ์ธํด์ฃผ์ธ์!
๊น์ด์ฐ์ ํ์(DFS)
ํ์ํ๋ ค๋ ๋ ธ๋์ ์์ ๋ ธ๋๋ถํฐ ์ฐ์ ํ์ํ๋ ๋ฐฉ์
ํ์ ๋ ธ๋์ ์ธ์ ๋ ธ๋์ ์์ ๋ ธ๋๋ค์ ๋ชจ๋ ํ์ํ๊ณ , ๋ค์ ๋์๊ฐ์ ๋ค๋ฅธ ์ธ์ ๋ ธ๋์ ์์๋ค์ ๋ชจ๋ ํ์ํฉ๋๋ค.
ํ์ ๋ ธ๋์ ๊ฐ์ฅ ๊น์ ๋๋๊น์ง ๋ค ํ์ํด์ผ ๋ค์ ์ธ์ ๋ ธ๋๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๊ตฌํ
ํ์ํ ๊ทธ๋ํ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ธฐ
let graph: [String: [String]] = [
"A" : ["B", "C"],
"B" : ["A", "D", "E"],
"C" : ["A", "F"],
"D" : ["B"],
"E" : ["B"],
"F" : ["C"],
]
๊น์ด์ฐ์ ํ์์ ํ๋ ๋ฐฉ๋ฒ
๊น์ด์ฐ์ ํ์์ ํ๊ฐ์ ํ(Queue)์ ํ๊ฐ์ ์คํ(Stack)์ผ๋ก ๊ตฌํํฉ๋๋ค.
needVisitStack : ๋ฐฉ๋ฌธํด์ผํ๋ ๋ ธ๋๋ฅผ ์ ์ฅํ๋ Stack
visitedQueue : ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ์ ์ฅํ๋ Queue
1. ํ์ํ ๋ ธ๋์ ๋ฐ์ดํฐ๋ฅผ needVisitStack์ ๋ฃ์ต๋๋ค.
2. needVisitStack์ ๋ง์ง๋ง ๊ฐ์ ์ถ์ถํด์, visitedQueue์ ํด๋นํ๋ ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค.
[์กด์ฌํ๋ ๊ฒฝ์ฐ] - ์ถ์ถํ ๊ฐ์ ๋ฒ๋ฆฌ๊ณ ๊ทธ ๋ค์ ๋ง์ง๋ง ๊ฐ์ ๋ค์ ์ถ์ถํ์ฌ visitedQueue์ ์กด์ฌํ๋ ์ง ํ์ธํฉ๋๋ค.
[์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ] - 3๋ฒ ๊ณผ์ ์ผ๋ก ๋์ด๊ฐ๋๋ค.
3. ์ถ์ถ๋ ๊ฐ์ด visitedQueue์ ์กด์ฌํ์ง ์์ผ๋ฉด, visitedQueue์ ์ถ๊ฐํฉ๋๋ค.
4. ์ถ์ถ๋ ๊ฐ์ ์ฐ๊ฒฐ๋ ๊ฐ์ ๋ค์ ๋ชจ๋ needVisitStack์ ์ถ๊ฐํฉ๋๋ค.
5. needVisitStack์ด ๋น ๋๊น์ง 2๋ฒ๋ถํฐ ๋ฐ๋ณตํฉ๋๋ค.
6. needVisitStack์ด ๋ชจ๋ ๋น์์ ๊ฒฝ์ฐ visitedQueue์ ์ฑ์์ง ๊ฐ๋ค์ด ํ์๋ ๋ ธ๋๋ค์ ์์์ธ ๊ฒ์ผ๋ก ๊ฒฐ๋ก ์ง์ต๋๋ค.
์ฝ๋
func DFS(graph: [String: [String]], start: String) -> [String] {
var visitedQueue: [String] = []
var needVisitStack: [String] = [start]
while !needVisitStack.isEmpty {
let node: String = needVisitStack.removeLast()
if visitedQueue.contains(node) { continue }
visitedQueue.append(node)
needVisitStack += graph[node] ?? []
}
return visitedQueue
}
๊น์ด์ฐ์ ํ์(DFS)์ ์๊ฐ ๋ณต์ก๋
์ผ๋ฐ์ ์ผ๋ก ๋ ธ๋ ์(V), ๊ฐ์ ์(E)๋ผ ํ์ ๋ ์๊ฐ๋ณต์ก๋๋ O(V+E)์ ๋๋ค.
์ ๋ ฅ ์์ฒด๋ฅผ ๋ ธ๋์ ๊ฐ์ ์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ต๋๋ค.
'๐ป CS > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๋ฐฑํธ๋ํน (0) | 2023.05.09 |
---|---|
[Swift] ๋์ ๊ณํ๋ฒ (Dynamic Programming) ์ดํดํ๊ธฐ (0) | 2023.04.12 |
[Swift] ๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ (0) | 2023.04.04 |
[Swift] (๋ถํ ์ ๋ณต) ํต ์ ๋ ฌ ๊ตฌํํด๋ณด๊ธฐ (0) | 2023.04.03 |
[Swift] ๋๋น์ฐ์ ํ์(BFS) ๊ตฌํํด๋ณด๊ธฐ (0) | 2023.03.29 |