νμ(Search): λ§μ μμ λ°μ΄ν° μ€μμ μνλ λ°μ΄ν°λ₯Ό μ°Ύλ κ³Όμ
- κ·Έλν, νΈλ¦¬ λ±μ μλ£κ΅¬μ‘° μμμ νμνλ λ¬Έμ λ₯Ό μ£Όλ‘ λ€λ£¬λ€.
- λνμ μΈ νμ μκ³ λ¦¬μ¦μΌλ‘ DFSμ BFSκ° μλ€.
λ μκ³ λ¦¬μ¦μ μ΄ν΄νκΈ° μν΄ νμν μλ£κ΅¬μ‘°
μλ£κ΅¬μ‘°(Data Struture): λ°μ΄ν°λ₯Ό νννκ³ κ΄λ¦¬νκ³ μ²λ¦¬νκΈ° μν ꡬ쑰
μ€νκ³Ό νλ μλ£κ΅¬μ‘°μ κΈ°μ΄ κ°λ μΌλ‘ λ€μ λ ν΅μ¬ ν¨μλ‘ κ΅¬μ±λλ€.
- μ½μ (Push): λ°μ΄ν°λ₯Ό μ½μ
- μμ (Pop): λ°μ΄ν°λ₯Ό μμ
μ€λ²νλ‘μ°(Overflow): νΉμ μλ£κ΅¬μ‘°κ° μμ©ν μ μλ λ°μ΄ν°μ ν¬κΈ°λ₯Ό λμ μνμμ μ½μ μ°μ°μ μνν λ λ°μ
μΈλνλ‘μ°(Underflow): νΉμ μλ£κ΅¬μ‘°μ λ°μ΄ν°κ° λ€μ΄μμ§ μμ μνμμ μμ μ°μ° μν μ λ°μ
μ€ν(Stack): λ°μ΄ν°λ₯Ό λ€μ΄μ¨ μμλλ‘ μκ³ κ°μ₯ λ§μ§λ§μΌλ‘ λ€μ΄μ¨ λ°μ΄ν°λΆν° λκ°λ ꡬ쑰, μ μ νμΆ(FILO) ꡬ쑰 λλ νμ μ μΆ(LIFO) ꡬ쑰λΌκ³ νλ€.
ν(Queue): κ°μ₯ λ¨Όμ λ€μ΄μ¨ λ°μ΄ν°λΆν° λκ°λ ꡬ쑰, μ μ μ μΆ(FIFO) ꡬ쑰λΌκ³ νλ€.
μ¬κ· ν¨μ(Recursive Function): μκΈ° μμ μ λ€μ νΈμΆνλ ν¨μ, 무νλλ‘ μ¬κ· νΈμΆ μ μ€λ₯κ° λ°μνκΈ° λλ¬Έμ μ’ λ£ μ‘°κ±΄ λͺ μκ° νμνλ€. κ°κ²°νκ² μ½λλ₯Ό μμ±ν μ μλ€.
κ·Έλν: λ Έλ(Node)μ κ°μ (Edge)μΌλ‘ ννλλ€. λ λ Έλκ° κ°μ μΌλ‘ μ°κ²°λμ΄ μμΌλ©΄ λ λ Έλλ μΈμ νλ€κ³ νν
κ·Έλν νμ: νλμ λ Έλλ₯Ό μμμΌλ‘ λ€μμ λ Έλλ₯Ό λ°©λ¬Έ
- μΈμ νλ ¬(Adjacency Matrix): 2μ°¨μ λ°°μ΄λ‘ κ·Έλνμ μ°κ²° κ΄κ³λ₯Ό νννλ λ°©μ
- μΈμ 리μ€νΈ(Adjacency List): 리μ€νΈλ‘ κ·Έλν μ°κ²° κ΄κ³λ₯Ό νννλ λ°©μ
- λ©λͺ¨λ¦¬ μΈ‘λ©΄μμ μΈμ νλ ¬μ λ Έλμ κ°μκ° λ§μμλ‘ λ©λͺ¨λ¦¬ λλΉ, μΈμ 리μ€νΈ λ°©μμ ν¨μ¨μ
- μΈμ 리μ€νΈ λ°©μμ μΈμ νλ ¬ λ°©μμ λΉν΄ λ Έλκ° μ°κ²°λμ΄ μλμ§μ λν μ 보λ₯Ό μ»λ μλκ° λλ¦Ό
DFS(Depth-First Search)
- κΉμ΄ μ°μ νμ
- κ·Έλνμμ κΉμ λΆλΆμ μ°μ μ μΌλ‘ νμνλ μκ³ λ¦¬μ¦
- νΉμ ν κ²½λ‘λ‘ νμνλ€κ° νΉμ μν©μμ μ΅λν κΉμμ΄ λ€μ΄κ°μ λ Έλλ₯Ό λ°©λ¬Έν ν λ€μ λμκ° λ€λ₯Έ κ²½λ‘λ₯Ό νμνλ μκ³ λ¦¬μ¦
- λͺ¨λ λ Έλλ₯Ό λ°©λ¬Ένκ³ μ νλ κ²½μ°μ μ¬μ©
- BFSμ λΉν΄ κ°λ¨νμ§λ§, BFSμ λΉν΄ λλ¦Ό
- μ€ν λλ μ¬κ· ν¨μλ₯Ό μ΄μ©νμ¬ κ΅¬ν
DFS λμ κ³Όμ
- νμ μμ λ Έλλ₯Ό μ€νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬νλ€.
- μ€νμ μ΅μλ¨ λ Έλμ λ°©λ¬Ένμ§ μμ μΈμ λ Έλκ° μλ€λ©΄ κ·Έ μΈμ λ Έλλ₯Ό μ€νμ λ£κ³ λ°©λ¬Έ μ²λ¦¬νλ€. λ°©λ¬Ένμ§ μμ μΈμ λ Έλκ° μλ€λ©΄ μ΅μλ¨ λ Έλλ₯Ό κΊΌλΈλ€
- 2λ² κ³Όμ μ λ μ΄μ μνν μ μμ λκΉμ§ λ°λ³΅νλ€.
BFS(Breadth First Search)
- λλΉ μ°μ νμ
- κ°κΉμ΄ λ ΈλλΆν° νμνλ μκ³ λ¦¬μ¦
- λ λ Έλ μ¬μ΄μ μ΅λ¨ κ²½λ‘λ₯Ό μ°Ύμ λ μ¬μ©
- νλ₯Ό μ΄μ©νμ¬ κ΅¬ν
BFS λμ κ³Όμ
- νμ μμ λ Έλλ₯Ό νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬νλ€.
- νμμ λ Έλλ₯Ό κΊΌλ΄ ν΄λΉ λ Έλμ μΈμ λ Έλ μ€ λ°©λ¬Ένμ§ μμ μ€λλ₯Ό λͺ¨λ νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬νλ€.
- 2λ² κ³Όμ μ λ μ΄μ μνν μ μμ λκΉμ§ λ°λ³΅νλ€.
DFSμ BFSμ μκ° λ³΅μ‘λ
- λ λ°©μ λͺ¨λ 쑰건 λ΄μ λͺ¨λ λ Έλλ₯Ό κ²μνλ€λ μ μμ μκ° λ³΅μ‘λ λμΌ
- λ€μ λ Έλκ° λ°©λ¬Ένμλμ§λ₯Ό νμΈνλ μκ°κ³Ό κ° λ Έλλ₯Ό λ°©λ¬Ένλ μκ°μ ν©
- μΈμ 리μ€νΈ: O(N+E)
- μΈμ νλ ¬: O(N²)
DFSμ BFS λ¬Έμ μ ν
- κ·Έλνμ λͺ¨λ λ Έλλ₯Ό λ°©λ¬Ένλ κ²μ΄ μ€μν λ¬Έμ => DFS, BFS
- κ²½λ‘μ νΉμ§μ μ μ₯ν΄λ¬μΌ νλ λ¬Έμ => DFS
- μ΅λ¨κ±°λ¦¬λ₯Ό ꡬν΄μΌ νλ λ¬Έμ => BFS
DFS / BFS λ¬Έμ
μλ£μ μΌλ € λ¨ΉκΈ°
N x M ν¬κΈ°μ μΌμ νμ΄ μλ€. ꡬλ©μ΄ λ«λ € μλ λΆλΆμ 0, μΉΈλ§μ΄κ° μ‘΄μ¬νλ λΆλΆμ 1λ‘ νμλλ€.
ꡬλͺ μ΄ λ«λ € μλ λΆλΆλΌλ¦¬ μ, ν, μ’, μ°λ‘ λΆμ΄ μλ κ²½μ° μλ‘ μ°κ²°λμ΄ μλ κ²μΌλ‘ κ°μ£Όνλ€.
μ΄λ, μΌμ νμ λͺ¨μμ΄ μ£Όμ΄μ‘μ λ μμ±λλ μ΄ μμ΄μ€ν¬λ¦Όμ κ°μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
var input = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input[0], m = input[1]
var graph = [[Int]]()
for i in 0..<n{
graph.append(readLine()!.map{Int(String($0))!})
}
func dfs(_ x: Int, _ y: Int) -> Bool{
if x <= -1 || x >= n || y <= -1 || y >= m {
return false
}
if graph[x][y] == 0{
graph[x][y] = 1
dfs(x-1, y)
dfs(x, y-1)
dfs(x+1, y)
dfs(x, y+1)
return true
}
return false
}
var result = 0
for i in 0..<n{
for j in 0..<m{
if dfs(i,j) == true{
result += 1
}
}
}
print(result)
λ―Έλ‘ νμΆ
λλΉμ΄λ N x M ν¬κΈ°μ μ§μ¬κ°ν ννμ λ―Έλ‘μ κ°ν μλ€. λ―Έλ‘μλ κ΄΄λ¬Όλ€μ΄ μμ΄ μ΄λ₯Ό νΌν΄ νμΆν΄μΌ νλ€.
λλΉμ΄λ (1,1)μ, μΆκ΅¬λ (N, M)μ μ‘΄μ¬νλ©°, ν λ²μ ν μΉΈμ© μ΄λν μ μλ€. κ΄΄λ¬Όμ΄ μλ λΆλΆμ 0, μλ λΆλΆμ 1λ‘ νμλλ€.
λ―Έλ‘λ λ°λμ νμΆν μ μλ ννλ‘ μ μλ λ, νμΆνκΈ° μν΄ μμ§μ¬μΌ νλ μ΅μ μΉΈμ κ°μλ₯Ό ꡬνμμ€.
//swiftλ νλ₯Ό μ 곡νμ§ μμ μ§μ ꡬν
struct Queue<T> {
private var queue: [T] = []
public var count: Int {
return queue.count
}
public var isEmpty: Bool {
return queue.isEmpty
}
public mutating func enqueue(_ element: T) {
queue.append(element)
}
public mutating func dequeue() -> T? {
return isEmpty ? nil : queue.removeFirst()
}
}
var input = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input[0], m = input[1]
var graph = [[Int]]()
for i in 0..<n{
graph.append(readLine()!.map{Int(String($0))!})
}
var dx = [-1, 1, 0, 0]
var dy = [0, 0, -1, 1]
func bfs(_ x: Int, _ y: Int) -> Int{
var queue = Queue<(Int,Int)>()
queue.enqueue((x,y))
while !queue.isEmpty{
var (x,y) = queue.dequeue()!
for i in 0..<4{
var nx = x + dx[i]
var ny = y + dy[i]
if nx < 0 || ny < 0 || nx >= n || ny >= m{ continue }
if graph[nx][ny] == 0{continue}
if graph[nx][ny] == 1 {
graph[nx][ny] = graph[x][y] + 1
queue.enqueue((nx,ny))
}
}
}
return graph[n-1][m-1]
}
print(bfs(0, 0))
'π Computer Science > Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] λ€μ΄λλ―Ή νλ‘κ·Έλλ°(Dynamic Programming) (0) | 2022.03.30 |
---|---|
[μκ³ λ¦¬μ¦] μ΄μ§ νμ(Binary Search) (0) | 2022.03.25 |
[μκ³ λ¦¬μ¦] μ λ ¬(Sorting) (0) | 2022.03.24 |
[μκ³ λ¦¬μ¦] ꡬν(Implementation) (0) | 2022.03.22 |
[μκ³ λ¦¬μ¦] 그리λ(Greedy) (0) | 2022.03.08 |