#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๊ฐ ์ํํ๊ฒ ๋ง๋ค์๋ค.
#3-3 ๋ฐฑํธ๋ํน (Backtracking)
๊ฐ๋
๋ฐฑํธ๋ํน(Backtracking)์ด๋ ๋ฐฑํธ๋ํน์ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๋, ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ ๋ต์ด ๋ ์ ์๋ ๊ฒฝ์ฐ๋ ๋นจ๋ฆฌ ํฌ๊ธฐ(๊ฐ์ง์น๊ธฐ) ํ๊ณ ๋์์ค๋ ๊ธฐ๋ฒ์ ์๋ฏธํ๋ค. ๊ฐ๋ น, ์๋์ ์ฝ๋๋ "๊ฐ์์ง"๋ก๋ถํฐ "ํฐ๋จธ๋ฆฌ์ค๋ชฉ๋์ด"๊น์ง ๊ฐ ์ ์๋ ์๋ ๋ชจ๋ ๊ฒฝ๋ก์ ์๋ฅผ ์ฐพ๋ ์ฝ๋๋ค (๋จ, ํ ๋ฒ ๋ฐฉ๋ฌธํ ์ ์ ์ ๋ค์ ๋ฐฉ๋ฌธํ ์ ์์).
์ฝ๋์ ์ค๋ช
// ๊ฒฝ๋ก ํ์ ๋ฌธ์ ๋ผ๋ ๊ฐ์ ํ์ ์ฝ๋์ด๋ฏ๋ก ์ ์ธ๋ ๋ณ์๋ค
val start = "๊ฐ์์ง"
val goal = "ํฐ๋จธ๋ฆฌ์ค๋ชฉ๋์ด"
val path = mutableListOf<String>()
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>()
println("๋ชจ๋ ๊ฒฝ๋ก:") // ๊ฒฝ๋ก ํ์ ๋ฌธ์ ๋ผ๋ ๊ฐ์ ํ์ ์ฝ๋์ด๋ฏ๋ก.
dfs(mapOfAdjacencyArray, start, visited) // start ์ ์ (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") // ์ฝ์ ์ฐฝ์ด ๋๋ฌ์์ง๋ฏ๋ก, ์๋ต
if (vertex == goal) { // ๊ฒฝ๋ก ํ์ ๋ฌธ์ ๋ผ๋ ๊ฐ์ ํ์ ์ฝ๋์ด๋ฏ๋ก ์ ์ธ๋ if๋ฌธ.
println(path)
} else {
// (4) ์ ์ ์ ์ด์ ์ ์ ๋ง๋ค (5)์ ์ํ
for (neighborVertex in mapOfAdjacencyArray[vertex]!!) {
// (5) visited ๋ชฉ๋ก์ ์๋ค๋ฉด, ์ด์ ์ ์ ์ ์ฌ๊ท ํธ์ถํ๋ค
if (neighborVertex !in visited) {
dfs(mapOfAdjacencyArray, neighborVertex, visited)
}
}
}
visited.remove(vertex) // ๋ฐฑํธ๋ํน
doSomethingFunction2() // ๋ฐฑํธ๋ํน ํ ํ ์ผ. ์ฌ๊ธฐ์ doSomethingFunction2()๋ก ํํํจ.
}
fun <T> doSomethingFunction(vertex: T) {
path.add(vertex.toString())
}
fun doSomethingFunction2() {
path.removeAt(path.size - 1)
}
/* ์ถ๋ ฅ ๊ฒฐ๊ณผ
๋ชจ๋ ๊ฒฝ๋ก:
[๊ฐ์์ง, ๊ณ ์์ด, ํฐ๋จธ๋ฆฌ์ค๋ชฉ๋์ด]
[๊ฐ์์ง, ์ฌ์ด, ํฐ๋จธ๋ฆฌ์ค๋ชฉ๋์ด]
*/
์์์ ์ฝ๊ฒ ์ค๋ช
ํ๋ ค๊ณ ๋ฐฑํธ๋ํน์ 'ํฌ๊ธฐ', '๊ฐ์ง์น๊ธฐ'๋ผ๋ ๋จ์ด๋ฅผ ํตํด ์ค๋ช
ํ์ง๋ง, ์ฌ์ค ํฌ๊ธฐ๋ผ๊ธฐ๋ณด๋จ '๋๋์๊ฐ', '์ด๊ธฐํ'์ ๊ฐ๊น๋ค. '๊ฐ์ง์น๊ธฐ'์ ๋ฌ์์ค์ฒ๋ผ ์์ ํ๊ฒ ๋ฒ๋ ค ๋ฐฐ์ ํ๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ข ๋ ์๋ฟ๋๋ก ๋น์ ๋ฅผ ํ์๋ฉด, Ctrl + Z๋ฅผ ํตํ ๋๋๋ฆฌ๊ธฐ(Undo)๋ค. ๊ทธ๋ฌ๋ ์ ์ฝ๋๋ฅผ ๋ด๋, ๋ฐฑํธ๋ํน์ ์ด๋ค ๋์์ธ์ง์ ๋ํ ๋๋์ ์๊ฒ ์ง๋ง ๊ทธ ๋์์ ์ง๊ด์ ์ผ๋ก ์ดํดํ๋ค๊ณ ๊น์ง ํ๊ธด ํ๋ค ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์๋๋ฅผ ์ฐธ์กฐํ์.
๋ฐฑํธ๋ํน์ด ํ์ํ๋ฐ ์ํํ์ง ์์ผ๋ฉด ์๊ธฐ๋ ์ผ
[๋ฐฑ์ค] 26169 (์ธ ๋ฒ ์ด๋ด์ ์ฌ๊ณผ๋ฅผ ๋จน์)
#1 ์๊ณ ๋ฆฌ์ฆ ๊ทธ๋ํ - ๊น์ด ์ฐ์ ํ์ (DFS, Depth-First Search)#1 ๊ทธ๋ํ์ ํ์ ๊น์ด ์ฐ์ ํ์ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ๊น์ด ์ฐ์ ํ์ ๊น์ด ์ฐ์ ํ์์ ์
kenel.tistory.com
์๋ ๋ฐฑํธ๋ํน์ด ๊ฐ๋ฏธ๋ DFS ๋ฌธ์ ์ ๋ํด ๋ค๋ฃฌ ๊ฒ์๊ธ์ด๋ค. ๋, ์ด ๊ฒ์๊ธ์ '์คํจํ ์ฝ๋' ๋ถ๋ถ์ ๋ฐฑํธ๋ํน์ด ํ์ํ ์ด์ ๊ฐ ๋์๋๋ฅผ ํตํด ์ง๊ด์ ์ผ๋ก ์ค๋ช
๋์ด์๋ค.
#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 |