๐ง Connected Components
๊ทธ๋ํ $G$ ์ Connected Component ์ธ $G'$ ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค.
Connected Component $G'$ of $G$ : Maximal connected subgraph of $G$
โ๏ธ Maximum๊ณผ Maximal์ ์ฐจ์ด
Maximum : ์ต๋๋ฅผ ์๋ฏธํฉ๋๋ค.
Maximal : ๋์ด์ ์ถ๊ฐํ ์ ์๋ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ฆ Connected Component์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ด ํด์ ๊ฐ๋ฅํฉ๋๋ค.
$G'$ ์์ ์ถ๊ฐ์ ์ผ๋ก $G$ ์ ์กด์ฌํ๋ ์๋ฌด ์ ์ ํ๋๋ฅผ ์ถ๊ฐํ๋ ์๊ฐ disconnected๊ฐ ๋๋ฉฐ, $G'$ ์ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ ์ ํฌํจํ๊ณ ์์ด์ผ ํฉ๋๋ค.
์ฆ induced subgraph๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด์ Connected Component์ ํน์ฑ์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$G$ ์ connected component๋ก $G$ ์ vertex set(์ ์ ๋ค์ ์งํฉ)์ partitioning ํ ์ ์์ต๋๋ค.
๋ํ DFS forest๋ฅผ ์ด๋ฃจ๋ ๊ฐ๊ฐ์ DFS tree๋ graph์ connected component์ ๋์ํฉ๋๋ค.
๋ฐ๋ผ์ DFS ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋ฒ explore๋ฅผ ํธ์ถํ ๋๋ง๋ค ์๋ก์ด connected component์ ์ํ vertex๋ค์ ๋ชจ๋ ๋ฐฉ๋ฌธํฉ๋๋ค.
์ด์ ๋ํ ์ฆ๋ช ์ reachablity ์ฆ๋ช ๊ณผ ๋์ผํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๐ ์ฆ๋ช
๊ท๋ฅ๋ฒ์ ํตํด ์ฆ๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
'์ ์ $v$ ์์ explore๋ฅผ ํธ์ถํ ๋ $v$์ ๋์ผํ connected component์ ์ํ ์ด๋ ํ vertex $u$ ๋ฅผ ๋ฐฉ๋ฌธํ์ง ์๋๋ค'๋ผ๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
$v$ ์ $u$ ๋ ๊ฐ์ connected component์ ์ํ๋ฏ๋ก, $v$ ์ $u$ ์ฌ์ด์๋ Path๊ฐ ์กด์ฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ $v$ ์ $u$ ์ฌ์ด์ Path์ ์กด์ฌํ๋ ์ ์ ๋ค ์ค ๋ง์ง๋ง์ผ๋ก ๋ฐฉ๋ฌธํ ์ ์ ์ $z$ ๋ผ ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ $z$ ์ดํ์ ๋ฐ๋ก ๋์ค๋ ์ ์ ์ $w$ ๋ผ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
explore procedure๋ ๋ ์ ์ฌ์ด๋ฅผ ์๋ ๊ฐ์ ์ด ์กด์ฌํ๋ฉด ๋ฐ๋์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ $(z, w) \in E$ ์์๋ ๋ถ๊ตฌํ๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ผ๋ ์ด๋ $z$ ์ ์ธ์ (adjacent)ํ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค๋ ์ฌ์ค์ ๋ชจ์๋ฉ๋๋ค.
๋ฐ๋ผ์ ํ๋ฒ explore๋ฅผ ํธ์ถํ ๋๋ง๋ค ์๋ก์ด connected component์ ์ํ vertex๋ค์ ๋ชจ๋ ๋ฐฉ๋ฌธํฉ๋๋ค.
๐ง Articulation points (Cut Vertex)
๊ทธ๋ํ $G$ ๊ฐ connected undirected graph๋ผ ํ๊ฒ ์ต๋๋ค.
์ด๋ค $G$ ์ ์ด๋ค ์ ์ $v$ ์, $v$ ์ ์ฐ๊ฒฐ๋(incident) ๋ชจ๋ ๊ฐ์ ๋ค์ ์ ๊ฑฐํ ๊ฒฝ์ฐ,
$G$ ๊ฐ disconnected ๋๋ค๋ฉด,
์ ์ $v$ ๋ฅผ $G$ ์ articulation point ( cut vertex ) ๋ผ๊ณ ํฉ๋๋ค.
์์ ๊ทธ๋ฆผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๐ง Articulation points ์ ๊ด๋ จ๋ DFS Tree์ ์ฑ์ง
โ๏ธ ์ ๋ฆฌ 1
DFS Tree์ Root Node์ Child Node๊ฐ 2๊ฐ ์ด์์ด๋ผ๋ฉด,
root node๋ articulation point์ด๋ฉฐ, ๊ทธ ์ญ๋ ์ฑ๋ฆฝํฉ๋๋ค.
๐ ์ฆ๋ช
์ฒซ๋ฒ์งธ ์ฆ๋ช ์ ์ผ๋ฐ์ ์ธ ์ผ์ด์ค๋ฅผ ํตํ ์ฆ๋ช ์ ๋๋ค.
Root node $r$ ์ด, ๋ ์์(Children) $a, b$๋ฅผ ๊ฐ์ง๋ค๊ณ ํ๊ฒ ์ต๋๋ค.
๋ง์ฝ tree edge $(r, a)$ ์ $(r, b)$ ๋ฅผ ํฌํจํ๋ cycle์ด ์กด์ฌํ๋ค๋ฉด, ๋ ์ค ํ๋๋ back edge๊ฐ ๋์ด์ผ ํ๋ฏ๋ก ๋ชจ์๋ฉ๋๋ค.
๋ฐ๋ผ์ root๊ฐ ์ ๊ฑฐ๋๋ค๋ฉด ๋ ธ๋ $a$์ ๋ ธ๋ $b$ ์ฌ์ด์๋ path๊ฐ ์์ผ๋ฏ๋ก, ๊ทธ๋ํ $G$ ๋ disconnected๊ฐ ๋ฉ๋๋ค.
์ฆ root node๋ articulation point ์ ๋๋ค.
๋๋ฒ์งธ ์ฆ๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Root Node $r$ ์ Articulation Point๋ผ ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ผ Articulation Point์ ์ ์์ ์ํ์ฌ DFS tree์์ $r$ ์ ์ ๊ฑฐํ๋ฉด, ์ ์ด๋ ๋๊ฐ์ connected component๊ฐ ์์ฑ๋์ด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ $r$ ์ child node๋ ๋ ๊ฐ ์ด์์ด์ด์ผ ํฉ๋๋ค.
โ๏ธ ์ ๋ฆฌ 2
DFS Tree์์
i. $s$ ๊ฐ $v$ ์ child node์ด๋ค.
ii. $s$ ์ descendant($s$๋ฅผ ํฌํจํ ์์)์ $v$์ proper ancestor($v$ ๋ฅผ ํฌํจํ์ง ์๋ ์กฐ์)๋ฅผ ์ฐ๊ฒฐํ๋ back edge๊ฐ ์กด์ฌํ์ง ์๋๋ค.
์ ๋ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋ ๋ ๋ฃจํธ ๋ ธ๋๊ฐ ์๋ $v, s$ ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ, $v$๋ articulation point ์ ๋๋ค.
๐ ์ฆ๋ช
์ฒซ๋ฒ์งธ ์ฆ๋ช ์ ์ผ๋ฐ์ ์ธ ์ผ์ด์ค๋ฅผ ํตํ ์ฆ๋ช ์ ๋๋ค.
์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ node $s$ ๊ฐ ์๋ค๊ณ ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋ฉด $v$ ๋ฅผ ์ ๊ฑฐํ๋ฉด $s$ ์ subtree ์์ ์ด๋ ํ node๋ ํด๋น node์์ $v$ ์ proper ancestor๋ก ๊ฐ๋ path๊ฐ ์กด์ฌํ์ง ์๊ฒ ๋ฉ๋๋ค.
(ํด๋น path๊ฐ ์กด์ฌํ๊ธฐ ์ํด์๋ back edge๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.)
๋ฐ๋ผ์ $v$ ๋ articulation point ์ ๋๋ค.
๋๋ฒ์งธ ์ฆ๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ node $s$ ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์ด ๊ฒฝ์ฐ $v$ ๋ฅผ ์ ๊ฑฐํ๋๋ผ๋ $v$ ์ proper ancestor๋ก ํฅํ๋ path๊ฐ ์กด์ฌํฉ๋๋ค.
(back edge๊ฐ ์กด์ฌํ๋ฏ๋ก)
๋ฐ๋ผ์ $v$๋ฅผ ์ ๊ฑฐํ๋๋ผ๋ ๊ทธ๋ํ๋ ์ฌ์ ํ connected ํฉ๋๋ค.
โ๏ธ ์ ๋ฆฌ 3
DFS Tree์ leaf node๋ articulation point๊ฐ ์๋๋๋ค.
๐ ์ฆ๋ช
Leaf node๋ child node๊ฐ ์๊ธฐ ๋๋ฌธ์ ํด๋น node๋ฅผ ์ ๊ฑฐํด๋ ๋๋จธ์ง๋ ์ฌ์ ํ tree ๊ตฌ์กฐ์ด๋ฉฐ,
tree์ ์ ์(Cycle์ด ์์ผ๋ฉฐ, Connected)์ ์ํด ํด๋น ๊ทธ๋ํ๋ connected ํฉ๋๋ค.
๐ง ๊ทธ๋ํ์ Articulation Point ์ฐพ์๋ด๊ธฐ ์ํ ์ฑ์ง
์์์ ์ดํด๋ณธ DFS Tree์ 3๊ฐ์ง ์ฑ์ง์ ์ด์ฉํฉ๋๋ค.
์์
์์ ๋ฐฉ๋ฒ์ ์ฝ๋์์ผ๋ก ๊ตฌํํ๊ธฐ ์ํด, previsit๊ณผ postvisit์ ์ฌ์ฉํฉ๋๋ค.
๊ตฌํ์ ํ์ํ ์ฑ์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
DFS Tree์ ์ด๋ ํ ๋ ธ๋ $v$ ์ ๋ํ์ฌ,
$v$ ์ ์ด๋ค descendant($v$๋ฅผ ํฌํจํ๋ ์์) $u$ ์,
$u$ ์ incidentํ back edge $(u, w)$ ๊ฐ ์๋ค๋ฉด,
$low (v) = min(pre(v), pre(w))$ ๋ก ์ ์ํ๊ฒ ์ต๋๋ค.
(์ฆ $low(v)$ ๋ $v$ ์์ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฅ pre๊ฐ ๋ฎ์ ๋ ธ๋์ pre๊ฐ์ ์๋ฏธํฉ๋๋ค.)
์ด๋ ๋ฃจํธ ๋ ธ๋๊ฐ ์๋ $v$ ๊ฐ $low(u)$ $\geq$ $pre(v)$ ๋ฅผ ๋ง์กฑํ๋ ์์(child) ๋ ธ๋ $u$ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, $v$ ๋ articulation point์ด๋ฉฐ, ์ญ๋ ์ฑ๋ฆฝํฉ๋๋ค.
์ด๋ Articulation Point๋ฅผ ํ๋ณํ๊ธฐ ์ํด ๋น๊ตํ๋ ๋ ธ๋๋ ์์ ๋ ธ๋๊ฐ ์๋ ์์ ๋ ธ๋๋ง ๋น๊ตํจ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
๐ ์ฆ๋ช
์๋๋ ๊ท๋ฅ๋ฒ์ ์ํ ์ฆ๋ช ์ ๋๋ค.
๋ฃจํธ ๋ ธ๋๊ฐ ์๋ $v$ ์ ๋ํ์ฌ, $low (u) \geq pre(v)$ ๋ฅผ ๋ง์กฑํ๋ child node $u$ ๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ $v$๊ฐ Articulation point๊ฐ ์๋๋ผ ๊ฐ์ ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$low (u) \geq pre(v)$ ์ด๊ธฐ ๋๋ฌธ์ $u$์ desendent ์์ $v$ ์ proper ancestor๋ก์ back edge๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ v๋ฅผ ์ ๊ฑฐํ๋ค๋ฉด v์ proper ancestor๋ก์ path๊ฐ ์์ด์ง๋ฏ๋ก ๊ทธ๋ํ๋ disconnected ๋ฉ๋๋ค.
๋ฐ๋ผ์ $v$ ๋ Articulation point๊ฐ ์๋๋ผ๋ ๊ฐ์ ์ด ๋ชจ์์ ๋๋ค.
$low(u)$ ๋ DFS Tree ์์์ $v$ ์ $v$ ์ Descendant๋ค( $v$ ํฌํจ )์ ์ฐ๊ฒฐ๋ ์์๋ค ์ค์์,
๊ฐ์ ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฌ ๊ฐ๋ฅํ preOrder ๊ฐ์ด ๊ฐ์ฅ ์์ ์ ์ ์ ์๋ฏธํฉ๋๋ค.
์ด์ ์ด๋ฅผ ์ด์ฉํ์ฌ ๊ทธ๋ํ ๋ด์ ๋ชจ๋ Articulation Point๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐ง ๊ทธ๋ํ ๋ด์ ๋ชจ๋ Articulation Point ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ฃจํธ ๋ ธ๋์ ๊ฒฝ์ฐ '์ ๋ฆฌ 1' ์ ํตํด ์ฝ๊ฒ ์์๋ผ ์ ์์ต๋๋ค. (child node๊ฐ 2๊ฐ ์ด์ ์๋์ง๋ง ํ์ธ)
- ๋ฃจํธ ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
- DFS ๋ฅผ ์ํํ๋ฉฐ low ๊ฐ์ ๊ณ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ๋ง์ฝ ์ ์ $v$ ์ ์์ ๋ ธ๋ $u$ ์ ๋ํ explore ๊ฐ ๋๋ ๋ค, $pre(v)$ ์ $low(u)$ ๋ฅผ ๋น๊ตํ์ฌ, $low(u)$ $\geq$ $pre(v)$ ์ธ ๊ฒฝ์ฐ, $v$ ๋ Articulation Point ์ ๋๋ค.
DFS ๋์ค $low(v)$ ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ๋ฐฉ๋ฒ
์ด๊ธฐ $low(v)$ ์ ๊ฐ์ $pre(v)$ ์ ๋๋ค.
์ดํ DFS๋ฅผ ์ํํ๋ฉฐ, Back edge $(v, u)$ ๊ฐ ์๋ค๋ฉด, $low(v)$ $=$ $min(\;$ $low(v)$ $,$ $pre(u)$ $\;)$ ๋ก ์ ๋ฐ์ดํธ ํฉ๋๋ค.
$v$์ ์์(child) $u$ ์ ๋ํ explore๊ฐ ๋๋๋ฉด $low(v)$ $= min(\;$ $low(v)$ $,$ $low(u)$ $\;)$ ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
์๋์ฝ๋
์ฝ๋๋ก ๊ตฌํ
๋ค์ ๊ทธ๋ํ์ ๋ํด ์ฝ๋๋ก ๊ตฌํํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
/**
* Created by ShinD on 2022/09/22.
*/
fun main() {
val graph = GraphMaker().make()
GraphExplorer().findCutPoint(
graph = graph,
current = GraphMaker.b,
root = GraphMaker.b
)
GraphMaker.vertexSet().forEach {
println("END [${it.value}], [ ${it.preOrder}, ${it.postOrder} ], LOW = [${it.low}], IS_CUT_POINT = [${it.isCutPoint}]")
}
}
class Graph(
val vertexSet: Set<Vertex>,
val graph: List<List<Vertex>>,
)
class GraphMaker {
companion object {
val a = Vertex('1')
val b = Vertex('2')
val c = Vertex('3')
val d = Vertex('4')
val e = Vertex('5')
val f = Vertex('6')
val g = Vertex('7')
val h = Vertex('8')
fun vertexSet(): Set<Vertex> {
return setOf(
a, b, c, d, e, f, g, h,// i, j, k, l
)
}
}
fun make(): Graph {
return Graph(
vertexSet = vertexSet(),
graph = listOf(
listOf(b, c), // 1
listOf(a, c, d, e), // 2
listOf(a, b), // 3
listOf(b, e, f), // 4
listOf(b, d, f), // 5
listOf(d, e, g, h), // 6
listOf(f, h), // 7
listOf(f, g), // 8
)
)
}
}
class Vertex(
val value: Char,
var preOrder: Int = 0,
var postOrder: Int = 0,
var low: Int = 0,
var isVisited: Boolean = false,
var isCutPoint: Boolean = false,
)
class GraphExplorer {
// ์์ ์ 1๋ก ์ด๊ธฐํ
private var counter = 1
private fun visited(vertex: Vertex) {
vertex.isVisited = true
println("VISIT [${vertex.value}]")
}
private fun preVisit(vertex: Vertex) {
vertex.preOrder = counter
counter++
}
private fun postVisit(vertex: Vertex) {
vertex.postOrder = counter
counter++
}
fun findCutPoint(
graph: Graph, // Connected Graph
current: Vertex, // DFS ์งํํ Vertex
root: Vertex, // DFS ๋ฅผ ์ฒ์ ์งํํ Root Vertex
parent: Vertex? = null,
) {
val idx = current.value - '1'
// ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited(current)
// preVisit
preVisit(current)
// PreOrder ๊ฐ์ผ๋ก low ์ค์
current.low = current.preOrder
var children = 0
// ๋ฃจํธ vertex์ adjacent ํ ๋ชจ๋ vertex ํ์
graph.graph[idx].forEach { vertex ->
// Back Edge์ธ ๊ฒฝ์ฐ
if (vertex.isVisited && vertex != parent) {
current.low = Math.min(current.low, vertex.preOrder)
}
// ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด explore
if (!vertex.isVisited) {
findCutPoint(graph, vertex, root, current)
current.low = Math.min(current.low, vertex.low)
if (
current != root // ์ด๋ current๋ root๊ฐ ์๋์ด์ผ ํจ
&& vertex.low >= current.preOrder // ์์ ๋
ธ๋(vertex) ์์ ํ์ฌ ๋
ธ๋(current)์ proper ancestor๋ก ํฅํ๋ Back Edge๊ฐ ์๋ ๊ฒฝ์ฐ
) {
current.isCutPoint = true; // current๋ Articulation Point(Cut Point)
}
// ์์ ์ 1 ์ฆ๊ฐ
children++
}
}
// ๋ง์ฝ ๋ฃจํธ๋
ธ๋์ด๋ฉฐ, ์์ ์๊ฐ 2๊ฐ ์ด์์ธ ๊ฒฝ์ฐ
if ((current.value == root.value) && children > 1) {
current.isCutPoint = true
}
postVisit(current)
}
}
๋ฐฑ์ค ๋ฌธ์
์๋ ๋ฌธ์ ๋ ๋จ์ ์ (Articulation Point)์ ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ์ จ๋ค๋ฉด, ํ์ด๋ผ ์ ์๋ ๋ฌธ์ ์ ๋๋ค.
https://www.acmicpc.net/problem/11266
์๋์ ๊ฐ์ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
๋ฐ๋ก Articulation Point์ ์ ์๋ฅผ ํตํ ๋ฐฉ๋ฒ์ผ๋ก, ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ํตํด์ ์ฐพ์๋ ๋๋ค.
๊ทธ๋ํ์์ ์ ์ ๋ค์ ํ๋์ฉ ์ ๊ฑฐํด๊ฐ๋ฉฐ ์์์ ์ดํด๋ณธ DFS๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ์ฑ(Connectivity)์ ์ฒดํฌํฉ๋๋ค.
ํด๋น ๊ณผ์ ์์, ์ด๋ ํ ์ ์ $v$ ๊ฐ ์ ๊ฑฐ๋ ํ ๊ทธ๋ํ $G$ ๊ฐ disconnected ์ํ๊ฐ ๋๋ค๋ฉด, $v$ ๋ Articulation Point๊ฐ ๋๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ดํด๋ณธ ์๊ณ ๋ฆฌ์ฆ์ ๋นํด ์๊ฐ ๋ณต์ก๋๊ฐ ํจ์ฌ ๋์ผ๋ฏ๋ก ์ข์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋๋ค.
'๐ฅ Computer Science > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ (5) - Directed Graph ์์์ DFS (0) | 2022.09.24 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ (4) - ์ด์ค ์ฐ๊ฒฐ ์์ (Biconnected Components) (0) | 2022.09.24 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ (2) - DFS (0) | 2022.09.24 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ (1) - ๊ทธ๋ํ์ ๊ธฐ๋ณธ ์ฉ์ด (0) | 2022.09.24 |
[์๊ณ ๋ฆฌ์ฆ] Selection ์๊ณ ๋ฆฌ์ฆ (0) | 2022.09.19 |