#1 ๊ทธ๋ํ์ ํ์
๊น์ด ์ฐ์ ํ์ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ๊น์ด ์ฐ์ ํ์ ๊น์ด ์ฐ์ ํ์์ ์ ๋๋ฉ์ด์ ์์ ๊น์ด ์ฐ์ ํ์( - ๅชๅ ๆข็ดข, ์์ด: depth-first search, DFS)์ ๋งน๋ชฉ์ ํ์๋ฐฉ๋ฒ์ ํ๋๋ก ํ์ํธ๋ฆฌ์ ์ต๊ทผ์ ์ฒจ๊ฐ
ko.wikipedia.org
๊ทธ๋ํ์ ๊ฐ ์ ์ ์ ํ๋ฒ์ฉ ๋ฐฉ๋ฌธํ ํ์๊ฐ ์๋ค๊ณ ํด๋ณด์. ๊ทธ ๋ฐฉ๋ฌธ์ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. ํ๋๋ ๊น์ด ์ฐ์ ํ์์ด๋ค. ๋ ๋ค๋ฅธ ํ๋๋ ๋๋น ์ฐ์ ํ์์ด๋ค. ๋ณธ ๊ฒ์๊ธ์์๋ ๊น์ด ์ฐ์ ํ์๋ฒ์ ๋ค๋ฃฌ๋ค. (๋๋น ์ฐ์ ํ์์ ๋ํด์๋ ์ด ๊ฒ์๊ธ์์ ๋ค๋ฃฌ๋ค)
#2 ์๊ณ ๋ฆฌ์ฆ
์๋๋ผ๋ฉด ์์๋๋ฅผ ํตํด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํ๊ณ ์ฝ๋๋ก ๋์ด๊ฐ๋ ํธ์ด ์ดํดํ๊ธฐ ์ข์ง๋ง, ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ฅ ์ฝ๋๋ถํฐ ๋ณด๋ ๊ฒ ์คํ๋ ค ์ดํด๊ฐ ๋ ๋น ๋ฅด๋ค๊ณ ์๊ฐํ๋ค. ๋ค๋ง, ์ธ์ ๋ฐฐ์ด (Adjacency Array)์ ์ง์์ ๋ํด์๋ ์๊ณ ์์ด์ผ ํ๋ค๋ ์ ์ ํ๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉํ ์ธ์ ๋ฐฐ์ด์ ์ด ๊ฒ์๊ธ์ ์๋ค (๊ฐ์ค์น๊ฐ ์๋ ๋ฌดํฅ ๊ทธ๋ํ).
๋์ ์ '๊น์ด ์ฐ์ ' ํ์์ด๋ผ๋ ์ด๋ฆ์ด ๋ถ์๋์ง๋ ์ค๋ช
ํ ๊ฐ์น๊ฐ ์๋ค. ๊น์ด ์ฐ์ ํ์์ ๋ค๋ฅธ ๋ง๋ก '์ฒซ๋ฒ์งธ ์์ ์ฐ์ ' ํ์์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ํ๋ ๊น์ด์ ๋๋ฎ์ด๊ฐ ์ ๊ทธ๋ํ์ฒ๋ผ y์ถ๊ณผ ํํํ๊ฒ ๊ทธ๋ ค์ง๋ค. ๋ฐ๋ผ์ '์ฒซ๋ฒ์งธ ์์ ์ฐ์ '์ผ๋ก ํ์ํ๋ค๋ ๋ง์, 2 → 3 → 4 → 5 → 6 → 7 → 8์ ๊ฐ์ ์์ผ๋ก ํ์ํ๋ค๋ ๋ง์ด ๋๋ค. ์ด ํ์์ y์ถ(๋์ด)๋ฅผ ์ฐ์ ํด ์ด๋ํ๋ ๋ชจ์์ด ๋๋ค (x์ถ ์ด๋์ y์ถ ํ์์ด ์ข
๋ฃ๋ ํ์ ์ํ๋๋ค. ์ฐ์ ์์๊ฐ ์๋ ๊ฒ์ด๋ค). ๊ทธ๋์ ๊น์ด ์ฐ์ ํ์์ด๋ผ ๋ถ๋ฅธ๋ค.
#3 ์ฝ๋ - ์ฝํ๋ฆฐ
#3-1 ๊ธฐ๋ณธ ์ฝ๋
fun main() {
// (1) listOfAdjacencyArray[n]์ด ๊ฐ์ง๋ ์๋ฏธ๋ฅผ ์์์ผ ํ๋ค (์ค๋ช
์ฐธ์กฐ)
val listOfAdjacencyArray = listOf(
arrayOf(1, 2),
arrayOf(0, 3, 4),
arrayOf(0, 4),
arrayOf(1),
arrayOf(1, 2)
)
// (2) visited๋ ๋ฐฉ๋ฌธ์ด ์๋ฃ๋ ์ ์ ๋ค์ ๊ธฐ๋กํ๋ Set(์งํฉ)์ด๋ค
val visited = mutableSetOf<Int>()
dfs(listOfAdjacencyArray, 0, visited) // 0๋ฒ ์ ์ (vertex)์์ ํ์ ์์
}
fun dfs(listOfAdjacencyArray: List<Array<Int>>, vertex: Int, visited: MutableSet<Int>) {
// (3) ๋งค๊ฐ๋ณ์ ์ ์ ์ visited์ ์ถ๊ฐํ๊ณ , ๋ฐฉ๋ฌธํด์ ์งํํ ์ผ์ ์ํํ๋ค. ์ฌ๊ธฐ์ doSomethingFunction()์ผ๋ก ํํํ๋ค
visited.add(vertex)
// doSomethingFunction(vertex)
println("Visit complete: $vertex")
// (4) ์ ์ ์ ์ด์ ์ ์ ๋ง๋ค (5)์ ์ํ
for (neighborVertex in listOfAdjacencyArray[vertex]) {
// (5) visited ๋ชฉ๋ก์ ์๋ค๋ฉด, ์ด์ ์ ์ ์ ์ฌ๊ท ํธ์ถํ๋ค
if (neighborVertex !in visited) {
dfs(listOfAdjacencyArray, neighborVertex, visited)
}
}
}
(1) listOfAdjacencyArray[n]์ด ๊ฐ์ง๋ ์๋ฏธ๋ฅผ ์์์ผ ํ๋ค
์ ์ ์ ๋ถ์ฌ๋ ๋ฒํธ๊ฐ 0 ~ N์ผ ๋, listOfAdjacencyArray[n]์ n๋ฒ ์ ์ ์ ์ฐ๊ฒฐ๋ ์ด์(neighbor) ์ ์ ๋ค์ ๋ฐฐ์ด์ ์๋ฏธํ๋ค.
(2) visited๋ ๋ฐฉ๋ฌธ์ด ์๋ฃ๋ ์ ์ ๋ค์ ๊ธฐ๋กํ๋ Set(์งํฉ)์ด๋ค
bfs์ ๋ฌ๋ฆฌ visited๊ฐ ๋ฐ์ ๋์ ์๋ค. dfs์ ๊ตฌ์กฐ(์ฌ๊ท ํธ์ถ) ๋๋ฌธ์ ๊ทธ๋ ๋ค
(3) ๋งค๊ฐ๋ณ์ ์ ์ ์ visited์ ์ถ๊ฐํ๊ณ , ๋ฐฉ๋ฌธ...
bfs์ ๋ํด ๋ค๋ฃฌ ์ด ๊ฒ์๊ธ๊ณผ ๋ฌ๋ฆฌ, Setํ ๋ณ์ ์ด๋ฆ์ visited๋ผ๊ณ ๋์๋ค. bfs์์์ ๋ฌ๋ฆฌ ๋ณธ ๊ฒ์๊ธ(dfs)์์๋, ์ด๋ค ์ ์ ์ Set์ ๋ฃ์(add())๊ณผ ๋์์ ํด๋น ์ ์ ์ '๋ฐฉ๋ฌธ'ํ ๊ฒ์ผ๋ก ์ทจ๊ธํ๊ธฐ ๋๋ฌธ์ด๋ค.
(4) ์ ์ ์ ์ด์ ์ ์ ๋ง๋ค (5)์ ์ํ
listOfAdjacencyArray[n]์ ๋ฐฉ๊ธ ๋ฐฉ๋ฌธ ์๋ฃํ ์ ์ n์ ์ฐ๊ฒฐ๋ ์ด์ ์ ์ ๋ค์ ๋ฐฐ์ด์ด๋ค. ์ด ๋ฐฐ์ด์ ์์๋ง๋ค (5)์ ์ํํ๋ค.
(5) visited ๋ชฉ๋ก์ ์๋ค๋ฉด, ์ด์ ์ ์ ์ ์ฌ๊ท ํธ์ถํ๋ค
์ฌ๊ท ํธ์ถ์ ์ํํ๋ค. ์ฌ๊ท ํธ์ถ์ ์คํ ๊ตฌ์กฐ๋ฅผ ์ด๋ฃฌ๋ค. ์ฆ, ๊ฐ์ฅ ๋ฆ๊ฒ(์ต๊ทผ์) ์ฌ๊ท ํธ์ถ๋ dfs()๊ฐ ๋จผ์ ์ฒ๋ฆฌ๋๋ค (ํ์
์ ์ถ). #2์์ ๊น์ด ์ฐ์ ํ์์ '์ฒซ๋ฒ์งธ ์์ ์ฐ์ ' ํ์์ด๋ผ๊ณ ๋งํ ์ด์ ๋ค. ๊ฐ ์ฌ๊ท ํธ์ถ์ listOfAdjacencyArray[vertex]์ ์ฒซ๋ฒ์งธ ์์ ์ฆ listOfAdjacencyArray[vertex][0]๋ถํฐ ์ํ๋๋ค. ๋, ํด๋น ์ฌ๊ท ํธ์ถ์์ ์ฐ์์ ์ผ๋ก ๋ฐ์ํ ์ฌ๊ท ํธ์ถ ๋ํ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์ ๋ฐฐ์ด์ ์ ํ ์ฒซ๋ฒ์งธ ์์๋ถํฐ ์ํ๋ ๊ฒ์ด๋ค.
#3-2 ์ ๋ค๋ฆญ์ ์ด์ฉํ ์ฝ๋
import kotlin.collections.HashMap
fun main() {
// (1) mapOfAdjacencyArray[n]์ด ๊ฐ์ง๋ ์๋ฏธ๋ฅผ ์์์ผ ํ๋ค (์ค๋ช
์ฐธ์กฐ)
val mapOfAdjacencyArray = HashMap<String, Array<String>>()
mapOfAdjacencyArray["๊ฐ์์ง"] = arrayOf("๊ณ ์์ด", "์ฌ์ด")
mapOfAdjacencyArray["๊ณ ์์ด"] = arrayOf("๊ฐ์์ง", "์ฝ๋ฟ์", "ํฐ๋จธ๋ฆฌ์ค๋ชฉ๋์ด")
mapOfAdjacencyArray["์ฌ์ด"] = arrayOf("๊ฐ์์ง", "ํฐ๋จธ๋ฆฌ์ค๋ชฉ๋์ด")
mapOfAdjacencyArray["์ฝ๋ฟ์"] = arrayOf("๊ณ ์์ด")
mapOfAdjacencyArray["ํฐ๋จธ๋ฆฌ์ค๋ชฉ๋์ด"] = arrayOf("๊ณ ์์ด", "์ฌ์ด")
// (2) visited๋ ๋ฐฉ๋ฌธ์ด ์๋ฃ๋ ์ ์ ๋ค์ ๊ธฐ๋กํ๋ Set(์งํฉ)์ด๋ค
val visited = mutableSetOf<String>()
dfs(mapOfAdjacencyArray, "๊ฐ์์ง", visited) // "๊ฐ์์ง" ์ ์ (vertex)์์ ํ์ ์์
}
fun <T> dfs(mapOfAdjacencyArray: Map<T, Array<T>>, vertex: T, visited: MutableSet<T>) {
// (3) ๋งค๊ฐ๋ณ์ ์ ์ ์ visited์ ์ถ๊ฐํ๊ณ , ๋ฐฉ๋ฌธํด์ ์งํํ ์ผ์ ์ํํ๋ค. ์ฌ๊ธฐ์ doSomethingFunction()์ผ๋ก ํํํ๋ค
visited.add(vertex)
// doSomethingFunction(vertex)
println("Visit complete: $vertex")
// (4) ์ ์ ์ ์ด์ ์ ์ ๋ง๋ค (5)์ ์ํ
for (neighborVertex in mapOfAdjacencyArray[vertex]!!) {
// (5) visited ๋ชฉ๋ก์ ์๋ค๋ฉด, ์ด์ ์ ์ ์ ์ฌ๊ท ํธ์ถํ๋ค
if (neighborVertex !in visited) {
dfs(mapOfAdjacencyArray, neighborVertex, visited)
}
}
}
์ง๊ธ๊น์ง ์ ์ ์ ํธ์์ Intํ์ด๋ผ๊ณ ๋ง ๋ค๋ค์ง๋ง, ์ ์ ์ ๊ตฌ๋ถํ๋ ๊ธฐ์ค์ด ๋ค๋ฅธ ๋ฐ์ดํฐํ์ผ ์๋ ์๋ค. ๊ทธ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋๋ก ์ ๋ค๋ฆญ์ ์ด์ฉํด ๋ฆฌํฉํ ๋งํ ์ฝ๋๋ค. listOfAdjacencyArray๊ฐ mapOfAdjacencyArray๋ก ๋ฐ๋ ๊ฒ์๋ ์ฃผ๋ชฉํ์. listOfAdjacencyArray์ index๋ ๋ฐ๋์ Int์ฌ์ผ ํ๋ค๋ ์ ์ฝ ์กฐ๊ฑด์ด ์๊ธฐ์ ์ด index์ ์ญํ ์, mapOfAdjacencyArray์ key๊ฐ ์ํํ๊ฒ ๋ง๋ค์๋ค.
#4 ์์ฝ
๊น์ด ์ฐ์ ํ์์ ์ธ์ ๋ฐฐ์ด์ ์์๋ค์ (์ฌ๊ท ํธ์ถ ๊ตฌ์กฐ๋ผ๋) Stack์ ๋ฃ๋๋ค.
'๊นจ์ ๊ฐ๋ ๐ > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (Greedy Algorithm) (0) | 2024.10.30 |
---|---|
๊ทธ๋ํ - ๋๋น ์ฐ์ ํ์ (BFS, Breadth-First Search) (0) | 2024.09.23 |
๊ทธ๋ํ - ๊ทธ๋ํ์ ์ข ๋ฅ์ ํํ (0) | 2024.01.09 |
๋์ ํ๋ก๊ทธ๋๋ฐ (Dynamic Programming), ์ํฅ์(Bottom-up) ๋ฐ ํํฅ์(Top-down) ์ ๊ทผ (0) | 2024.01.04 |
์ ๋ ฌ - ํต ์ ๋ ฌ (Quick Sort) (0) | 2023.12.01 |