λ¬Έμ
https://www.acmicpc.net/problem/2206
λ΄ λ¬Έμ νμ΄
let nm = readLine()!.split(separator: " ").map({Int(String($0))!})
let n = nm[0]
let m = nm[1]
var map = [[Int]]()
var result = 0
var queue = [(Int, Int, Int)]()
let dx = [0, 0, -1, 1]
let dy = [-1, 1, 0, 0]
var visited = Array(repeating: Array(repeating: [0, 0], count: m), count: n)
for _ in 0..<n { map.append(Array(readLine()!).map{Int(String($0))!}) }
func bfs() -> Int {
queue.append((0, 0, 1))
visited[0][0][1] = 1
var index = 0
while queue.count > index {
let (x, y, z) = queue[index]
index += 1
if (x, y) == (n-1, m-1) { return visited[x][y][z] }
for i in 0..<4 {
let nx = x + dx[i]
let ny = y + dy[i]
if nx < 0 || ny < 0 || nx >= n || ny >= m { continue }
if visited[nx][ny][z] == 0 {
// λ²½μ΄κ³ , λ²½μ λΆμμ§ μμλ κ²½μ° => λΆμ μ μλ κ²½μ°
if map[nx][ny] == 1 && z == 1 {
visited[nx][ny][0] = visited[x][y][1] + 1
queue.append((nx, ny, 0))
}
// λ²½μ΄ μλ κ²½μ°
else if map[nx][ny] == 0 {
visited[nx][ny][z] = visited[x][y][z] + 1
queue.append((nx, ny, z))
}
}
}
}
return -1
}
print(bfs())
π bfs λ¬Έμ λ‘, 3μ°¨μ λ°°μ΄μ λ§λ€μ΄μ μ리λ§λ€ λ²½μ λΆμλμ§, λΆμμ§ μκ³ μ΄λνλμ§ μ²΄ν¬ν΄μ£Όλκ² ν¬μΈνΈ,,!
μ΄ λ¬Έμ λ κ²½λ‘λ₯Ό νμνλ©΄μ, λ²½μ λΆμκ³ μλμ§ μλλ©΄ λΆμμ§ μκ³ μλμ§λ₯Ό ν¨κ» νμ
ν΄μ£Όμ΄μΌ νλ―λ‘
2μ°¨μ λ°°μ΄μμ 3μ°¨μ λ°°μ΄λ‘ νμ₯νμ¬ (λ²½μ λΆμκ³ μ¨ κ²½μ°) / (λΆμμ§ μκ³ μ¨ κ²½μ°)λ‘ λλμ΄ μ²΄ν¬ν΄μΌνλ€.
[ λ³μ μ€λͺ ]
- queueλ bfs ν¨μμμ νμν μ리λ€μ λμ νλ λ°°μ΄μ΄λ€.
(xμ’ν, yμ’ν, λΆμ μ μλμ§(0)/λΆμ μ μλμ§(1)) ννλ‘ μ μ₯ν μ μκ² νλ€. - dx, dyλ νμν μ’νλ₯Ό λ§λ€κΈ° μν λ°°μ΄μ΄λ€.
- visitedλ μ리λ§λ€ λ°©λ¬Έ μ¬λΆλ₯Ό 체ν¬νκ³ , ν΄λΉ μ리κΉμ§ κ±Έλ¦° μκ°μ μ μ₯νλ λ°°μ΄μ΄λ€.
3μ°¨μμΌλ‘ νμ₯ν΄μ 'λΆμ μ΄λ ₯μ΄ μλμ§ / λΆμ μ μλμ§'κΉμ§ νμΈν μ μκ² νλ€.
[x][y][0]μ 0 μ΄μμ κ°μ΄ μ μ₯λλ€λ©΄ ν λ² λΆμμ μλ μνλ‘ (x, y)μ λ°©λ¬Ένλ€λ μλ―Έμ΄κ³ ,
[x][y][1]μ 0 μ΄μμ κ°μ΄ μ μ₯λλ€λ©΄ λΆμ μ μ μλ μνλ‘ (x, y)μ λ°©λ¬Ένλ€λ λ»μ΄λ€.
[ bfs ν¨μ μ€λͺ ]
- κ°μ₯ λ¨Όμ queueμ νμμ μμν μ리μ λν μ 보λ₯Ό μΆκ°ν΄μ£Όμλ€.
μμμ μ μμ§ λ²½μ λΆμ μ μλ κ²μ΄ λΉμ°νλ―λ‘ (0, 0, 1)μ μΆκ°νλ€. - κ·Έλ¦¬κ³ (0, 0) μ’νλ₯Ό λ°©λ¬Ένκ³ λ²½μ λΆμμ§ μμμΌλ―λ‘
visited[0][0][1]μ 1μ μ μ₯ν΄μ£Όμλ€. (1μ μ΄λν μκ°μ μλ―Ένλλ°, λ¬Έμ μμ μ£Όμ΄μ§ 쑰건μ μνλ€.) - index λ³μλ₯Ό μ¬μ©νμ¬ removeFirstλ₯Ό νΌν΄μ£Όμ΄ μκ° λ³΅μ‘λλ₯Ό μ€μλ€.
- forλ¬Έμ 4λ² λ°λ³΅νμ¬ μνμ’μ°μ λν μ’νκ°μ κ΅¬ν΄ νμνλλ‘ νκ³ ,
νμν μλ¦¬κ° mapμ λ²μλ₯Ό λ²μ΄λμ§ μμΌλ©° λ°©λ¬Έν μ μλ κ²½μ°μ λν΄μ νμμ μ§ννλ€. - νμν μ리μ λ²½μ΄ μμ κ²½μ°, zκ° 1μ΄μ΄μΌλ§ λ²½μ λΆμ μ μλ€λ λ»μ΄ λλ€.
λ°λΌμ map[nx][ny] == 1 && z == 1 μΌ κ²½μ°λ₯Ό 쑰건μΌλ‘ λΉΌμ£Όμλ€.
μ΄ λλ visited λ°°μ΄μ ν΄λΉ μ리μ λ²½μ λΆμλ€λ κ²μ νμνκ³ , κ±Έλ¦° μκ°μ κΈ°λ‘νλ€.
κ·Έλ¦¬κ³ queueμ μλ‘κ² νμν μ’νμ, λ²½μ λΆμλ€λ μ 보λ₯Ό ν¨κ» μΆκ°ν΄μ£Όμλ€. - λ²½μ΄ μμ κ²½μ°μλ z κ°μ κ΄κ³κ° μμΌλ―λ‘ μκ°ν΄μ€ νμκ° μλ€.
μ΄ λλ λ²½μ΄ μμ κ²½μ°μ 쑰건과 κ°μ΄ μ¬κΈ°κΉμ§ μ¨ κ±°λ¦¬λ₯Ό κΈ°λ‘ν΄μ£Όκ³ ,
μ΄μ μ λ²½μ λΆμλμ§μ λν μ΄λ ₯μ κ·Έλλ‘ μ λ¬ν΄μ£Όμλ€.
κ·Έλ¦¬κ³ μλ‘κ² νμν μ’νμ, λ§μ°¬κ°μ§λ‘ μ΄μ μ λ²½μ λΆμλμ§μ λν μ΄λ ₯λ ν¨κ» μΆκ°νλ€. - κ°μ₯ λ¨Όμ (n-1, m-1) μ’νμ λλ¬ν κ²½μ°κ° κ°μ₯ μ΅λ¨ μκ°μ λμ°©ν κ²½μ°κ° λλ―λ‘
κ·Έ λλ ν΄λΉ μ리μ μ μ₯λ κ°μ 리ν΄νλ€. - while λ°λ³΅μ΄ μ§νλλ λμ ν λ²λ (n-1, m-1) μ’νμ λλ¬νμ§ λͺ»νλ€λ©΄
λλ¬ν μ μμλ€λ μλ―Έμ΄λ―λ‘ κ·Έ λλ -1μ 리ν΄νκ² νλ€.
π‘ νΌλλ°±
- 3μ°¨μ λ°°μ΄μ λ§λ€μ΄μ ( λ²½μ λΆμ κ²½μ° / λΆμμ§ μμ κ²½μ° ) μ΄λ κ² λλ μ€ μκ°μ ν μ μλ€λ©΄
ν¬κ² μ΄λ ΅μ§ μμ λ¬Έμ μλ κ² κ°μ§λ§, λλ κ·Έ μκ°μ νλλ°μ κ½€ μ€λκ±Έλ Έλ€. - μ²μμλ queueμ (x, y, λΆμμ μλμ§ true or false) μ΄λ κ² λ΄λλ‘ νκ³ ,
visited λ°°μ΄μ mapκ³Ό λμΌνκ² 2μ°¨μμΌλ‘ λ§λ€μ΄μ κ±Έλ¦° μκ°λ€λ§ λμ νκ² νλλ°,
κ·Έλ κ² νλκΉ μμΈκ° μκΈ°λλΌ,,! κ·Έλμ λ€μ νμλ€.
=> λ°±μ€ μ§λ¬Έ κ²μμμ μ°Ύμ λ°λ‘
5 8
01000000
01010000
01010000
01010011
00010010
'3οΈβ£ Swift > Problem Solving' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift Algorithm] μκΈ° μμ΄ BOJ #16236 (0) | 2022.01.25 |
---|---|
[Swift Algorithm] μ λ‘μμ½ BOJ #10026 (0) | 2022.01.23 |
[Swift Algorithm] ν νΈλ‘λ―Έλ Έ BOJ #14500 (2) | 2022.01.19 |
[Swift Algorithm] μ΄μ€μ°μ μμν Programmers(Lv.3) (0) | 2021.12.21 |
[Swift Algorithm] κ΅¬κ° ν© κ΅¬νκΈ° 4 BOJ #11659 (2) | 2021.10.20 |
λκΈ