π
λ²μ¨ 6μμ λλ€ π«
μ€λμ μκ³ λ¦¬μ¦μμ κΌ μμμΌ νλ DFS !!
μ λ² κΈμμ μμ£Ό μ§§κ² μΈκΈνμλλ°
μ€λμ κ°λ + μ½λλ‘ μκ·Όμκ·Ό μΉμ΄λ΄ μλ€ π¬
κΉμ΄ μ°μ νμ (DFS, Depth-First Search)
κ·Έλν νμ μκ³ λ¦¬μ¦ μ€ νλλ‘, μ£Όμ΄μ§ κ·Έλνμμ ν μ μ μ μμμΌλ‘ κ·Έλνλ₯Ό νμνλ λ°©λ²μ΄λ€. κ·Έλνλ μ μ (λ Έλ)κ³Ό κ°μ μ μ§ν©μΌλ‘ μ΄λ£¨μ΄μ§ μλ£κ΅¬μ‘°λ‘, κ° μ μ μ λ€λ₯Έ μ μ κ³Ό μ°κ²°λ μ μλ€. νμνλ €λ λ Έλμ μμ λ ΈλλΆν° μ°μ νμ(κΉμ΄λ₯Ό μ°μ νμ¬ νμ)νλ λ°©μμ΄λ€. νμ κ³Όμ μμ μ νν λ Έλμ μ°κ²°λ λ Έλλ€μ λͺ¨λ λ°©λ¬Έν νμλ μ΄μ λ Έλ(λΆλͺ¨ λ Έλ)λ‘ λμκ°μ λ€λ₯Έ μ°κ²°λ λ Έλλ₯Ό μ ννλ€. μ΄ κ³Όμ μ λ°λ³΅νμ¬ κ·Έλνμ λͺ¨λ μ μ μ λ°©λ¬Ένλ€. DFSλ μ£Όλ‘ κ·Έλν μνλ μ€λμΏ λ±μ λ¬Έμ μμ νμ©λλ€.

π μ«μκ° νμ μμμ ! νμ λ Έλμ μμ λ Έλλ€μ λͺ¨λ νμνκ³ , λ€μ λμκ° νμ λ Έλμ λ€λ₯Έ μΈμ λ Έλ μμλ€μ λͺ¨λ νμ.
DFS ꡬν λ°©λ²
βπ» μ¬κ· ν¨μ μ¬μ©
- DFS ν¨μ μ μ
- νμ¬ λ Έλλ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμ
- νμ¬ λ Έλμ μ°κ²°λ λͺ¨λ μ΄μ λ Έλλ₯Ό νμΈ
- μ΄μ λ Έλ μ€ λ°©λ¬Ένμ§ μμ λ Έλλ₯Ό μ¬κ·μ μΌλ‘ νΈμΆνμ¬ DFS μν
- μ¬κ· νΈμΆμ ν΅ν΄ DFSλ₯Ό μ§ννλ©΄μ μ€νμ μν μ λμ
βπ» μ€ν μ¬μ©
- μ€ν μμ± ν μμ λ Έλλ₯Ό μ€νμ λ£κΈ°
- μ€νμ΄ λΉ λκΉμ§ λ€μ μμ
λ°λ³΅
- μ€νμμ λ Έλλ₯Ό νλ κΊΌλ΄κ³ λ°©λ¬Έν κ²μΌλ‘ νμ
- ν΄λΉ λ Έλμ μ°κ²°λ λͺ¨λ μ΄μ λ Έλ μ€ λ°©λ¬Ένμ§ μμ λ Έλλ₯Ό μ€νμ λ£κΈ°
- λͺ¨λ λ Έλλ₯Ό λ°©λ¬Έν λκΉμ§ λ°λ³΅
βοΈ μ¬κ· ν¨μλ₯Ό μ¬μ©νλ©΄ μ½λκ° κ°κ²°ν΄μ§μ§λ§, νΈμΆ μ€νμ κΉμ΄μ λ°λΌ μ€ν μ€λ²νλ‘μ°κ° λ°μν μ μλ€. μ€νμ μ§μ ꡬννμ¬ μ¬μ©νλ©΄ νΈμΆ μ€νμ μ νμ νΌν μ μμ§λ§ μ½λλ μ’ λ 볡μ‘ν΄μ§ μ μμ.
π€ DFSμμ μ€νμ μ¬μ©νλ μ΄μ
DFSλ κΉμ΄λ₯Ό μ°μ μΌλ‘ κ·Έλνλ₯Ό νμνκΈ° λλ¬Έμ νμ¬ λ Έλμμ ν λ°©ν₯μΌλ‘ μ΅λν κΉκ² νμν νμ λ€μ λΆκΈ°λ‘ μ§ννκΈ° μν΄μ μ€νμ νμ©νλ€. μ€νμ LIFOμ νΉμ±μ κ°μ§κ³ μκΈ° λλ¬Έμ μμλ€μ μμμΌλ‘ μ μ₯ν μ μλ€.
μ¦, μ€νμ μ¬μ©νλ©΄ νμ¬ νμ μ€μΈ κ²½λ‘λ₯Ό κΈ°μ΅νκ³ μ μ§ν μ μλ€. νμ¬ λ Έλμ μ°κ²°λ μ΄μ λ Έλλ€ μ€ νλλ₯Ό μ ννμ¬ νμμ μ§νν νμ, λ€μμ νμν μ΄μ λ Έλκ° μ€νμ 맨 μμ μμΉνκ² λλ€. μ΄λ κ² νμ¬ κ²½λ‘μ λμμλΆν° νμμ κ³μν μ μλ€.
Swiftλ‘ DFS ꡬννκΈ° (feat. BOJ 1260)
Baekjoonμμ μμ λ¬Έμ λ₯Ό κ°μ Έμλ€. μ΄ λ¬Έμ μ κΈ°μ΄νμ¬ μ½λλ₯Ό μ§λ³΄κ² μ΄ !!! DFSλ§ μ§€ κ²μ λλ· π ( BFSλ λ€μ κΈμμ βββ )
1260λ²: DFSμ BFS
첫째 μ€μ μ μ μ κ°μ N(1 β€ N β€ 1,000), κ°μ μ κ°μ M(1 β€ M β€ 10,000), νμμ μμν μ μ μ λ²νΈ Vκ° μ£Όμ΄μ§λ€. λ€μ Mκ°μ μ€μλ κ°μ μ΄ μ°κ²°νλ λ μ μ μ λ²νΈκ° μ£Όμ΄μ§λ€. μ΄λ€ λ μ μ μ¬
www.acmicpc.net
π λ¬Έμ
κ·Έλνλ₯Ό DFSλ‘ νμν κ²°κ³Όμ BFSλ‘ νμν κ²°κ³Όλ₯Ό μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±νμμ€. λ¨, λ°©λ¬Έν μ μλ μ μ μ΄ μ¬λ¬ κ°μΈ κ²½μ°μλ μ μ λ²νΈκ° μμ κ²μ λ¨Όμ λ°©λ¬Ένκ³ , λ μ΄μ λ°©λ¬Έν μ μλ μ μ΄ μλ κ²½μ° μ’ λ£νλ€. μ μ λ²νΈλ 1λ²λΆν° Nλ²κΉμ§μ΄λ€.
π μ λ ₯
첫째 μ€μ μ μ μ κ°μ N(1 β€ N β€ 1,000), κ°μ μ κ°μ M(1 β€ M β€ 10,000), νμμ μμν μ μ μ λ²νΈ Vκ° μ£Όμ΄μ§λ€. λ€μ Mκ°μ μ€μλ κ°μ μ΄ μ°κ²°νλ λ μ μ μ λ²νΈκ° μ£Όμ΄μ§λ€. μ΄λ€ λ μ μ μ¬μ΄μ μ¬λ¬ κ°μ κ°μ μ΄ μμ μ μλ€. μ λ ₯μΌλ‘ μ£Όμ΄μ§λ κ°μ μ μλ°©ν₯μ΄λ€.
π μΆλ ₯
첫째 μ€μ DFSλ₯Ό μνν κ²°κ³Όλ₯Ό, κ·Έ λ€μ μ€μλ BFSλ₯Ό μνν κ²°κ³Όλ₯Ό μΆλ ₯νλ€. VλΆν° λ°©λ¬Έλ μ μ μμλλ‘ μΆλ ₯νλ©΄ λλ€.
π μμ μ λ ₯
4 5 1
1 2
1 3
1 4
2 4
3 4
μ μμ μ λ ₯μ κΈ°λ°μΌλ‘ κ·Έλνλ₯Ό μμν΄λ³΄λ©΄, 1μ 2, 3, 4μ μ°κ²°, 2λ 1, 4μ μ°κ²°, 3μ 1, 4μ μ°κ²°, 4λ 1, 2, 3κ³Ό μ°κ²°λμ΄ μλ€.
π μμ μΆλ ₯
1 2 4 3 // DFS
1 2 3 4 // BFS
π μ λ΅
let nmr = readLine()!.split(separator: " ").map{Int($0)!}
let n = nmr[0], m = nmr[1], r = nmr[2]
var visitedDFS = [Bool](repeating: false, count: n + 1)
var answerDFS = [Int]()
var graph = [[Int]](repeating: [], count: n + 1)
for _ in 0..<m { // μ μ μ 보 μ μ₯
let uv = readLine()!.split(separator: " ").map{Int($0)!}
graph[uv[0]].append(uv[1])
graph[uv[1]].append(uv[0])
}
dfs(r)
print(answerDFS.map{String($0)}.joined(separator: " "))
func dfs(_ start: Int) { // μ¬κ·λ₯Ό μ΄μ©νμ¬ DFS
visitedDFS[start] = true // νμ¬ νμ μ μ μ λ°©λ¬Έ
answerDFS.append(start) // νμ κ³Όμ κΈ°λ‘ λ°°μ΄μ μ μ₯
for node in graph[start].sorted() { // μΈμ μ μ μ΄ μ¬λ¬ κ°λ©΄ μμ κ²λΆν°
if !visitedDFS[node] { dfs(node) } // λ°©λ¬Ένμ§ μμ μ μ μΌ κ²½μ° DFS
}
}
π νμ΄
- visitedDFSλ λ°©λ¬Έν μ μ κ³Ό λ°©λ¬Ένμ§ μμ μ μ μ ꡬλΆνκΈ° μν λ°°μ΄μ΄λ€.
- answerDFSλ νμ κ³Όμ μ κΈ°λ‘νκΈ° μν λ°°μ΄μ΄λ€.
- graphλ κ° μ μ λ€μ΄ κ°μ λ€μ ν΅ν΄ λ€λ₯Έ μ μ λ€κ³Ό μ°κ²°λ μ 보λ₯Ό μ μ₯νκΈ° μν λ°°μ΄μ΄λ€.
- 0μΈ μ μ μ΄ μμΌλ―λ‘ ν¬κΈ°λ n + 1λ‘ ν΄μ€λ€.
// graph
[[], [2, 3, 4], [1, 4], [1, 4], [1, 2, 3]]
μ¬κ· ν¨μ μ€ν κ³Όμ μ΄ μ΄ν΄κ° μ μ λ μ μμΌλ μμ£Ό ν μ€ ν μ€ λ―μ΄λ³΄μκ΅¬μ¬ π¦·
- μ²μμ dfs(1)λ‘ μΈν΄ graph[1] (1κ³Ό μΈμ ν λͺ¨λ μ μ )λ₯Ό νμ
- μ μ 1μ λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 1μ μΆκ°
- visitedDFS: [false, true, false, false, false]
- answerDFS: [1]
- μΈμ μ μ μ μννκΈ° μ μ graph[1]μ μ λ ¬. μ λ ¬λ μΈμ μ μ μ [2, 3, 4]κ° λλ€.
- μΈμ μ μ μ νλμ© μννλ©΄μ μ¬κ·μ μΌλ‘ dfs ν¨μλ₯Ό νΈμΆ
- 첫 λ²μ§Έ μΈμ μ μ μΈ 2λ₯Ό λ°©λ¬Ένμ§ μμμΌλ―λ‘ dfs(2)λ₯Ό νΈμΆ
- μ μ 2λ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 2 μΆκ°
- visitedDFS: [false, true, true, false, false]
- answerDFS: [1, 2]
- μΈμ μ μ μ μννκΈ° μ μ graph[2]μ μ λ ¬. μ λ ¬λ μΈμ μ μ μ [1, 4]κ° λλ€.
- μΈμ μ μ μ€μμ λ°©λ¬Ένμ§ μμ μ μ 4λ₯Ό λ°κ²¬νκ³ dfs(4)λ₯Ό νΈμΆ
- μ μ 4λ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 4λ₯Ό μΆκ°
- visitedDFS: [false, true, true, false, true]
- answerDFS: [1, 2, 4]
- μΈμ μ μ μ μννκΈ° μ μ graph[4]μ μ λ ¬. μ λ ¬λ μΈμ μ μ μ [1, 2, 3]κ° λλ€.
- 1, 2λ λ°©λ¬Έν μ μ΄ μμ. λ°©λ¬Ένμ§ μμ μ μ 3 λ°κ²¬νκ³ dfs(3) νΈμΆ
- μ μ 3μ λ°©λ¬Έν κ²μ νμνκ³ answerDFSμ μ μ 3 μΆκ°
- visitedDFS: [false, true, true, true, true]
- answerDFS: [1, 2, 4, 3]
- μΈμ μ μ μ μννκΈ° μ μ graph[3]μ μ λ ¬. μ λ ¬λ μΈμ μ μ μ [1, 4]
- λ°©λ¬Ένμ§ μμ μ μ μ΄ μμ. ν¨μ μ¬κ· μ€ν X ( μ΄μ λΉ μ Έλκ°μ ~~~ π )
- μ μ 3μ λ°©λ¬Έν κ²μ νμνκ³ answerDFSμ μ μ 3 μΆκ°
- dfs(3) μ’ λ£
- μ μ 4λ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 4λ₯Ό μΆκ°
- λ°©λ¬Ένμ§ μμ μ μ μ΄ μμΌλ―λ‘ dfs(4) μ’ λ£
- μ μ 2λ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 2 μΆκ°
- λ°©λ¬Ένμ§ μμ μ μ μ΄ μμΌλ―λ‘ dfs(2) μ’ λ£
- 첫 λ²μ§Έ μΈμ μ μ μΈ 2λ₯Ό λ°©λ¬Ένμ§ μμμΌλ―λ‘ dfs(2)λ₯Ό νΈμΆ
- λ°©λ¬Ένμ§ μμ μ μ μ΄ μμΌλ―λ‘ dfs(1) μ’ λ£
μ΄λ κ² μ€ν κ³Όμ μ μμ£Ό μμΈνκ² λ€μ¬λ€ 보μλ€... π₯΅
μ€ν κ³Όμ μ 보면, μ¬κ· ν¨μλ₯Ό ν΅ν΄ μΈμ μ μ μ μμ λ Έλλ₯Ό νμνλ©΄μ μ΅λν κΉκ² λ€μ΄κ°λ€κ° λμ€λ κ²μ νμΈ ν μ μλ€.
π‘ μ¬κ·κ° μλλΌ κ·Έλ₯ μ€νμΌλ‘ ꡬννκ² λλ©΄ visitedDFS(λ°©λ¬Έν μ μ λ°°μ΄)κ³Ό needVisitDFS(νμν΄μΌ νλ μ μ λ°°μ΄)μ μ¬μ©νλ€. needVisitDFSκ° λΉκ² λλ©΄ νμμ΄ μ’ λ£λλ€. μ리λ μ¬κ·μ λμΌνλ€. μ½λλ§ μ‘°κΈ λ€λ₯Ό λΏ γ γ
μΌλ°μ μΌλ‘ μ¬κ· λ°©μμ λ§μ΄ μ¬μ©νκΈ°μ μ λ μ¬κ· μ½λλ‘ μ§λ³΄μμ΅λλ€λμ₯ πΏοΈ
μ¬κ· μ½λ μ΄λ κ² νλνλ λ―μ΄μ κΈ°λ‘ν 건 μ²μ...
λ€λ€ μ΄ κΈ λ³΄κ³ μ½κ² μ΄ν΄ ν μ μκΈΈ λ°λΌλ©° π§
'Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Algorithm] λ°±νΈλνΉ(Backtracking)κ³Ό λΈλ£¨νΈν¬μ€(Brute Force) (0) | 2023.05.19 |
---|---|
[Algorithm/Swift] λμ κ³νλ²(DP) (1) | 2023.05.16 |
π
λ²μ¨ 6μμ λλ€ π«
μ€λμ μκ³ λ¦¬μ¦μμ κΌ μμμΌ νλ DFS !!
μ λ² κΈμμ μμ£Ό μ§§κ² μΈκΈνμλλ°
μ€λμ κ°λ + μ½λλ‘ μκ·Όμκ·Ό μΉμ΄λ΄ μλ€ π¬
κΉμ΄ μ°μ νμ (DFS, Depth-First Search)
κ·Έλν νμ μκ³ λ¦¬μ¦ μ€ νλλ‘, μ£Όμ΄μ§ κ·Έλνμμ ν μ μ μ μμμΌλ‘ κ·Έλνλ₯Ό νμνλ λ°©λ²μ΄λ€. κ·Έλνλ μ μ (λ Έλ)κ³Ό κ°μ μ μ§ν©μΌλ‘ μ΄λ£¨μ΄μ§ μλ£κ΅¬μ‘°λ‘, κ° μ μ μ λ€λ₯Έ μ μ κ³Ό μ°κ²°λ μ μλ€. νμνλ €λ λ Έλμ μμ λ ΈλλΆν° μ°μ νμ(κΉμ΄λ₯Ό μ°μ νμ¬ νμ)νλ λ°©μμ΄λ€. νμ κ³Όμ μμ μ νν λ Έλμ μ°κ²°λ λ Έλλ€μ λͺ¨λ λ°©λ¬Έν νμλ μ΄μ λ Έλ(λΆλͺ¨ λ Έλ)λ‘ λμκ°μ λ€λ₯Έ μ°κ²°λ λ Έλλ₯Ό μ ννλ€. μ΄ κ³Όμ μ λ°λ³΅νμ¬ κ·Έλνμ λͺ¨λ μ μ μ λ°©λ¬Ένλ€. DFSλ μ£Όλ‘ κ·Έλν μνλ μ€λμΏ λ±μ λ¬Έμ μμ νμ©λλ€.

π μ«μκ° νμ μμμ ! νμ λ Έλμ μμ λ Έλλ€μ λͺ¨λ νμνκ³ , λ€μ λμκ° νμ λ Έλμ λ€λ₯Έ μΈμ λ Έλ μμλ€μ λͺ¨λ νμ.
DFS ꡬν λ°©λ²
βπ» μ¬κ· ν¨μ μ¬μ©
- DFS ν¨μ μ μ
- νμ¬ λ Έλλ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμ
- νμ¬ λ Έλμ μ°κ²°λ λͺ¨λ μ΄μ λ Έλλ₯Ό νμΈ
- μ΄μ λ Έλ μ€ λ°©λ¬Ένμ§ μμ λ Έλλ₯Ό μ¬κ·μ μΌλ‘ νΈμΆνμ¬ DFS μν
- μ¬κ· νΈμΆμ ν΅ν΄ DFSλ₯Ό μ§ννλ©΄μ μ€νμ μν μ λμ
βπ» μ€ν μ¬μ©
- μ€ν μμ± ν μμ λ Έλλ₯Ό μ€νμ λ£κΈ°
- μ€νμ΄ λΉ λκΉμ§ λ€μ μμ
λ°λ³΅
- μ€νμμ λ Έλλ₯Ό νλ κΊΌλ΄κ³ λ°©λ¬Έν κ²μΌλ‘ νμ
- ν΄λΉ λ Έλμ μ°κ²°λ λͺ¨λ μ΄μ λ Έλ μ€ λ°©λ¬Ένμ§ μμ λ Έλλ₯Ό μ€νμ λ£κΈ°
- λͺ¨λ λ Έλλ₯Ό λ°©λ¬Έν λκΉμ§ λ°λ³΅
βοΈ μ¬κ· ν¨μλ₯Ό μ¬μ©νλ©΄ μ½λκ° κ°κ²°ν΄μ§μ§λ§, νΈμΆ μ€νμ κΉμ΄μ λ°λΌ μ€ν μ€λ²νλ‘μ°κ° λ°μν μ μλ€. μ€νμ μ§μ ꡬννμ¬ μ¬μ©νλ©΄ νΈμΆ μ€νμ μ νμ νΌν μ μμ§λ§ μ½λλ μ’ λ 볡μ‘ν΄μ§ μ μμ.
π€ DFSμμ μ€νμ μ¬μ©νλ μ΄μ
DFSλ κΉμ΄λ₯Ό μ°μ μΌλ‘ κ·Έλνλ₯Ό νμνκΈ° λλ¬Έμ νμ¬ λ Έλμμ ν λ°©ν₯μΌλ‘ μ΅λν κΉκ² νμν νμ λ€μ λΆκΈ°λ‘ μ§ννκΈ° μν΄μ μ€νμ νμ©νλ€. μ€νμ LIFOμ νΉμ±μ κ°μ§κ³ μκΈ° λλ¬Έμ μμλ€μ μμμΌλ‘ μ μ₯ν μ μλ€.
μ¦, μ€νμ μ¬μ©νλ©΄ νμ¬ νμ μ€μΈ κ²½λ‘λ₯Ό κΈ°μ΅νκ³ μ μ§ν μ μλ€. νμ¬ λ Έλμ μ°κ²°λ μ΄μ λ Έλλ€ μ€ νλλ₯Ό μ ννμ¬ νμμ μ§νν νμ, λ€μμ νμν μ΄μ λ Έλκ° μ€νμ 맨 μμ μμΉνκ² λλ€. μ΄λ κ² νμ¬ κ²½λ‘μ λμμλΆν° νμμ κ³μν μ μλ€.
Swiftλ‘ DFS ꡬννκΈ° (feat. BOJ 1260)
Baekjoonμμ μμ λ¬Έμ λ₯Ό κ°μ Έμλ€. μ΄ λ¬Έμ μ κΈ°μ΄νμ¬ μ½λλ₯Ό μ§λ³΄κ² μ΄ !!! DFSλ§ μ§€ κ²μ λλ· π ( BFSλ λ€μ κΈμμ βββ )
1260λ²: DFSμ BFS
첫째 μ€μ μ μ μ κ°μ N(1 β€ N β€ 1,000), κ°μ μ κ°μ M(1 β€ M β€ 10,000), νμμ μμν μ μ μ λ²νΈ Vκ° μ£Όμ΄μ§λ€. λ€μ Mκ°μ μ€μλ κ°μ μ΄ μ°κ²°νλ λ μ μ μ λ²νΈκ° μ£Όμ΄μ§λ€. μ΄λ€ λ μ μ μ¬
www.acmicpc.net
π λ¬Έμ
κ·Έλνλ₯Ό DFSλ‘ νμν κ²°κ³Όμ BFSλ‘ νμν κ²°κ³Όλ₯Ό μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±νμμ€. λ¨, λ°©λ¬Έν μ μλ μ μ μ΄ μ¬λ¬ κ°μΈ κ²½μ°μλ μ μ λ²νΈκ° μμ κ²μ λ¨Όμ λ°©λ¬Ένκ³ , λ μ΄μ λ°©λ¬Έν μ μλ μ μ΄ μλ κ²½μ° μ’ λ£νλ€. μ μ λ²νΈλ 1λ²λΆν° Nλ²κΉμ§μ΄λ€.
π μ λ ₯
첫째 μ€μ μ μ μ κ°μ N(1 β€ N β€ 1,000), κ°μ μ κ°μ M(1 β€ M β€ 10,000), νμμ μμν μ μ μ λ²νΈ Vκ° μ£Όμ΄μ§λ€. λ€μ Mκ°μ μ€μλ κ°μ μ΄ μ°κ²°νλ λ μ μ μ λ²νΈκ° μ£Όμ΄μ§λ€. μ΄λ€ λ μ μ μ¬μ΄μ μ¬λ¬ κ°μ κ°μ μ΄ μμ μ μλ€. μ λ ₯μΌλ‘ μ£Όμ΄μ§λ κ°μ μ μλ°©ν₯μ΄λ€.
π μΆλ ₯
첫째 μ€μ DFSλ₯Ό μνν κ²°κ³Όλ₯Ό, κ·Έ λ€μ μ€μλ BFSλ₯Ό μνν κ²°κ³Όλ₯Ό μΆλ ₯νλ€. VλΆν° λ°©λ¬Έλ μ μ μμλλ‘ μΆλ ₯νλ©΄ λλ€.
π μμ μ λ ₯
4 5 1
1 2
1 3
1 4
2 4
3 4
μ μμ μ λ ₯μ κΈ°λ°μΌλ‘ κ·Έλνλ₯Ό μμν΄λ³΄λ©΄, 1μ 2, 3, 4μ μ°κ²°, 2λ 1, 4μ μ°κ²°, 3μ 1, 4μ μ°κ²°, 4λ 1, 2, 3κ³Ό μ°κ²°λμ΄ μλ€.
π μμ μΆλ ₯
1 2 4 3 // DFS
1 2 3 4 // BFS
π μ λ΅
let nmr = readLine()!.split(separator: " ").map{Int($0)!}
let n = nmr[0], m = nmr[1], r = nmr[2]
var visitedDFS = [Bool](repeating: false, count: n + 1)
var answerDFS = [Int]()
var graph = [[Int]](repeating: [], count: n + 1)
for _ in 0..<m { // μ μ μ 보 μ μ₯
let uv = readLine()!.split(separator: " ").map{Int($0)!}
graph[uv[0]].append(uv[1])
graph[uv[1]].append(uv[0])
}
dfs(r)
print(answerDFS.map{String($0)}.joined(separator: " "))
func dfs(_ start: Int) { // μ¬κ·λ₯Ό μ΄μ©νμ¬ DFS
visitedDFS[start] = true // νμ¬ νμ μ μ μ λ°©λ¬Έ
answerDFS.append(start) // νμ κ³Όμ κΈ°λ‘ λ°°μ΄μ μ μ₯
for node in graph[start].sorted() { // μΈμ μ μ μ΄ μ¬λ¬ κ°λ©΄ μμ κ²λΆν°
if !visitedDFS[node] { dfs(node) } // λ°©λ¬Ένμ§ μμ μ μ μΌ κ²½μ° DFS
}
}
π νμ΄
- visitedDFSλ λ°©λ¬Έν μ μ κ³Ό λ°©λ¬Ένμ§ μμ μ μ μ ꡬλΆνκΈ° μν λ°°μ΄μ΄λ€.
- answerDFSλ νμ κ³Όμ μ κΈ°λ‘νκΈ° μν λ°°μ΄μ΄λ€.
- graphλ κ° μ μ λ€μ΄ κ°μ λ€μ ν΅ν΄ λ€λ₯Έ μ μ λ€κ³Ό μ°κ²°λ μ 보λ₯Ό μ μ₯νκΈ° μν λ°°μ΄μ΄λ€.
- 0μΈ μ μ μ΄ μμΌλ―λ‘ ν¬κΈ°λ n + 1λ‘ ν΄μ€λ€.
// graph
[[], [2, 3, 4], [1, 4], [1, 4], [1, 2, 3]]
μ¬κ· ν¨μ μ€ν κ³Όμ μ΄ μ΄ν΄κ° μ μ λ μ μμΌλ μμ£Ό ν μ€ ν μ€ λ―μ΄λ³΄μκ΅¬μ¬ π¦·
- μ²μμ dfs(1)λ‘ μΈν΄ graph[1] (1κ³Ό μΈμ ν λͺ¨λ μ μ )λ₯Ό νμ
- μ μ 1μ λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 1μ μΆκ°
- visitedDFS: [false, true, false, false, false]
- answerDFS: [1]
- μΈμ μ μ μ μννκΈ° μ μ graph[1]μ μ λ ¬. μ λ ¬λ μΈμ μ μ μ [2, 3, 4]κ° λλ€.
- μΈμ μ μ μ νλμ© μννλ©΄μ μ¬κ·μ μΌλ‘ dfs ν¨μλ₯Ό νΈμΆ
- 첫 λ²μ§Έ μΈμ μ μ μΈ 2λ₯Ό λ°©λ¬Ένμ§ μμμΌλ―λ‘ dfs(2)λ₯Ό νΈμΆ
- μ μ 2λ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 2 μΆκ°
- visitedDFS: [false, true, true, false, false]
- answerDFS: [1, 2]
- μΈμ μ μ μ μννκΈ° μ μ graph[2]μ μ λ ¬. μ λ ¬λ μΈμ μ μ μ [1, 4]κ° λλ€.
- μΈμ μ μ μ€μμ λ°©λ¬Ένμ§ μμ μ μ 4λ₯Ό λ°κ²¬νκ³ dfs(4)λ₯Ό νΈμΆ
- μ μ 4λ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 4λ₯Ό μΆκ°
- visitedDFS: [false, true, true, false, true]
- answerDFS: [1, 2, 4]
- μΈμ μ μ μ μννκΈ° μ μ graph[4]μ μ λ ¬. μ λ ¬λ μΈμ μ μ μ [1, 2, 3]κ° λλ€.
- 1, 2λ λ°©λ¬Έν μ μ΄ μμ. λ°©λ¬Ένμ§ μμ μ μ 3 λ°κ²¬νκ³ dfs(3) νΈμΆ
- μ μ 3μ λ°©λ¬Έν κ²μ νμνκ³ answerDFSμ μ μ 3 μΆκ°
- visitedDFS: [false, true, true, true, true]
- answerDFS: [1, 2, 4, 3]
- μΈμ μ μ μ μννκΈ° μ μ graph[3]μ μ λ ¬. μ λ ¬λ μΈμ μ μ μ [1, 4]
- λ°©λ¬Ένμ§ μμ μ μ μ΄ μμ. ν¨μ μ¬κ· μ€ν X ( μ΄μ λΉ μ Έλκ°μ ~~~ π )
- μ μ 3μ λ°©λ¬Έν κ²μ νμνκ³ answerDFSμ μ μ 3 μΆκ°
- dfs(3) μ’ λ£
- μ μ 4λ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 4λ₯Ό μΆκ°
- λ°©λ¬Ένμ§ μμ μ μ μ΄ μμΌλ―λ‘ dfs(4) μ’ λ£
- μ μ 2λ₯Ό λ°©λ¬Έν κ²μΌλ‘ νμνκ³ answerDFSμ μ μ 2 μΆκ°
- λ°©λ¬Ένμ§ μμ μ μ μ΄ μμΌλ―λ‘ dfs(2) μ’ λ£
- 첫 λ²μ§Έ μΈμ μ μ μΈ 2λ₯Ό λ°©λ¬Ένμ§ μμμΌλ―λ‘ dfs(2)λ₯Ό νΈμΆ
- λ°©λ¬Ένμ§ μμ μ μ μ΄ μμΌλ―λ‘ dfs(1) μ’ λ£
μ΄λ κ² μ€ν κ³Όμ μ μμ£Ό μμΈνκ² λ€μ¬λ€ 보μλ€... π₯΅
μ€ν κ³Όμ μ 보면, μ¬κ· ν¨μλ₯Ό ν΅ν΄ μΈμ μ μ μ μμ λ Έλλ₯Ό νμνλ©΄μ μ΅λν κΉκ² λ€μ΄κ°λ€κ° λμ€λ κ²μ νμΈ ν μ μλ€.
π‘ μ¬κ·κ° μλλΌ κ·Έλ₯ μ€νμΌλ‘ ꡬννκ² λλ©΄ visitedDFS(λ°©λ¬Έν μ μ λ°°μ΄)κ³Ό needVisitDFS(νμν΄μΌ νλ μ μ λ°°μ΄)μ μ¬μ©νλ€. needVisitDFSκ° λΉκ² λλ©΄ νμμ΄ μ’ λ£λλ€. μ리λ μ¬κ·μ λμΌνλ€. μ½λλ§ μ‘°κΈ λ€λ₯Ό λΏ γ γ
μΌλ°μ μΌλ‘ μ¬κ· λ°©μμ λ§μ΄ μ¬μ©νκΈ°μ μ λ μ¬κ· μ½λλ‘ μ§λ³΄μμ΅λλ€λμ₯ πΏοΈ
μ¬κ· μ½λ μ΄λ κ² νλνλ λ―μ΄μ κΈ°λ‘ν 건 μ²μ...
λ€λ€ μ΄ κΈ λ³΄κ³ μ½κ² μ΄ν΄ ν μ μκΈΈ λ°λΌλ©° π§
'Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Algorithm] λ°±νΈλνΉ(Backtracking)κ³Ό λΈλ£¨νΈν¬μ€(Brute Force) (0) | 2023.05.19 |
---|---|
[Algorithm/Swift] λμ κ³νλ²(DP) (1) | 2023.05.16 |