[μ€μννΈ μκ³ λ¦¬μ¦] κ²½μ£Όλ‘ κ±΄μ€
λ¬Έμ
https://programmers.co.kr/learn/courses/30/lessons/67259
μ½λ©ν μ€νΈ μ°μ΅ - κ²½μ£Όλ‘ κ±΄μ€
[[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,0,1,0,0,0,1,0],[0,1,0,0,0,1,0,0],[1,0,0,0,0,0,0,0]] 3800 [[0,0,1,0],[0,0,0,0],[0,1,0,1],[1,0,0,0]] 2100 [[0,0,0,0,0,0],[0,1,1,1,1,0],[0,0,1,0,0,0],[1,0,0,1,0,1],[
programmers.co.kr
λ¬Έμ μ€λͺ

건μ€νμ¬μ μ€κ³μ¬μΈ μ£ λ₯΄λλ κ³ κ°μ¬λ‘λΆν° μλμ°¨ κ²½μ£Όλ‘ κ±΄μ€μ νμν 견μ μ μλ’°λ°μμ΅λλ€.
μ 곡λ κ²½μ£Όλ‘ μ€κ³ λλ©΄μ λ°λ₯΄λ©΄ κ²½μ£Όλ‘ λΆμ§λ N x N ν¬κΈ°μ μ μ¬κ°ν 격μ ννμ΄λ©° κ° κ²©μλ 1 x 1 ν¬κΈ°μ
λλ€.
μ€κ³ λλ©΄μλ κ° κ²©μμ μΉΈμ 0 λλ 1 λ‘ μ±μμ Έ μμΌλ©°, 0μ μΉΈμ΄ λΉμ΄ μμμ 1μ ν΄λΉ μΉΈμ΄ λ²½μΌλ‘ μ±μμ Έ μμμ λνλ
λλ€.
κ²½μ£Όλ‘μ μΆλ°μ μ (0, 0) μΉΈ(μ’μΈ‘ μλ¨)μ΄λ©°, λμ°©μ μ (N-1, N-1) μΉΈ(μ°μΈ‘ νλ¨)μ
λλ€. μ£ λ₯΄λλ μΆλ°μ μΈ (0, 0) μΉΈμμ μΆλ°ν μλμ°¨κ° λμ°©μ μΈ (N-1, N-1) μΉΈκΉμ§ 무μ¬ν λλ¬ν μ μκ² μ€κ°μ λκΈ°μ§ μλλ‘ κ²½μ£Όλ‘λ₯Ό 건μ€ν΄μΌ ν©λλ€.
κ²½μ£Όλ‘λ μ, ν, μ’, μ°λ‘ μΈμ ν λ λΉ μΉΈμ μ°κ²°νμ¬ κ±΄μ€ν μ μμΌλ©°, λ²½μ΄ μλ μΉΈμλ κ²½μ£Όλ‘λ₯Ό 건μ€ν μ μμ΅λλ€.
μ΄λ, μΈμ ν λ λΉ μΉΈμ μν λλ μ’μ°λ‘ μ°κ²°ν κ²½μ£Όλ‘λ₯Ό μ§μ λλ‘ λΌκ³ ν©λλ€.
λν λ μ§μ λλ‘κ° μλ‘ μ§κ°μΌλ‘ λ§λλ μ§μ μ μ½λ λΌκ³ λΆλ¦
λλ€.
κ±΄μ€ λΉμ©μ κ³μ°ν΄ 보λ μ§μ λλ‘ νλλ₯Ό λ§λ€ λλ 100μμ΄ μμλλ©°, μ½λλ₯Ό νλ λ§λ€ λλ 500μμ΄ μΆκ°λ‘ λλλ€.
μ£ λ₯΄λλ 견μ μ μμ±μ μν΄ κ²½μ£Όλ‘λ₯Ό 건μ€νλ λ° νμν μ΅μ λΉμ©μ κ³μ°ν΄μΌ ν©λλ€.
μλ₯Ό λ€μ΄, μλ κ·Έλ¦Όμ μ§μ λλ‘ 6κ°μ μ½λ 4κ°λ‘ ꡬμ±λ μμμ κ²½μ£Όλ‘ μμμ΄λ©°, κ±΄μ€ λΉμ©μ 6 x 100 + 4 x 500 = 2600μ μ λλ€.

λ λ€λ₯Έ μλ‘, μλ κ·Έλ¦Όμ μ§μ λλ‘ 4κ°μ μ½λ 1κ°λ‘ ꡬμ±λ κ²½μ£Όλ‘μ΄λ©°, κ±΄μ€ λΉμ©μ 4 x 100 + 1 x 500 = 900μ μ λλ€.

λλ©΄μ μν(0μ λΉμ΄ μμ, 1μ λ²½)μ λνλ΄λ 2μ°¨μ λ°°μ΄ boardκ° λ§€κ°λ³μλ‘ μ£Όμ΄μ§ λ, κ²½μ£Όλ‘λ₯Ό 건μ€νλλ° νμν μ΅μ λΉμ©μ return νλλ‘ solution ν¨μλ₯Ό μμ±ν΄μ£ΌμΈμ.
νμ΄
μ΄ λ¬Έμ λ κ·Έλν νμκ³Ό λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ ν¨κ» μ¬μ©ν΄μΌ μκ°μ΄κ³Όλ₯Ό νΌν μ μλ λ¬Έμ μμ΅λλ€. κ·Έλμ κ° μμΉμ λν μ΅μ λΉμ©μ κ³μ κ°±μ νλ©΄μ νμ¬ μ΅μ λΉμ©λ³΄λ€ ν° λΉμ©μ΄ 걸리λ μ§μ μ λ§λ¬μ λλ λ μ΄μ νμμ μ§ννμ§ μλλ‘ ν΄μ μ°μ°νμλ₯Ό μ΅μν ν μ μμ΅λλ€.
μλ₯Ό λ€λ©΄, A -> B -> C νμκ²½λ‘, D -> B -> C μ νμκ²½λ‘κ° μμ λ, κ²½λ‘ A-B-Cμμμ Bμ§μ μ μ΅μλΉμ©μ΄ 100μ΄κ³ , DBCλ₯Ό νμν λ Bμ μ΅μλΉμ©μ΄ 200μ΄λΌλ©΄, λλ¨Έμ§ Cλ₯Ό νμν νμμμ΄ μ΄λ―Έ μ΅μλΉμ©μ λ§λ€ μ μμμ μ μ μμ΅λλ€. κ·Έλμ κ° μ§μ μ μ΅μλΉμ©μ κ³μ μ μ₯νλ©΄μ κ°±μ νλ DP λ°°μ΄μ νμλ‘ ν©λλ€.
λν λ¬Έμ μμ μ½λλΉμ©μ λν 쑰건λλ¬Έμ λ°μνλ μμΈμν©μ΄ μμ΅λλ€. μ΄λ€ μ§μ μμ μ΄λ€ λ°©ν₯μ μ ννλμ§μ λ°λΌμ μ΅μλΉμ©μ΄ λ¬λΌμ§κΈ° λλ¬Έμ, λͺ¨λ λ°©ν₯μ λν μ΅μλΉμ©μ μκ³ μμ΄μΌ ν©λλ€. λ°λΌμ DP λ°°μ΄μ κ° λ°©ν₯μ λν΄ 4κ°λ₯Ό μ€μ ν΄μ λ°©ν₯μ λν μ΅μλΉμ©μ λͺ¨λ κΈ°λ‘ν΄μΌν©λλ€.
μ½λ
import Foundation | |
func solution(_ board:[[Int]]) -> Int { | |
enum Direction: Int { | |
case down, up, right, left; | |
} | |
let costs = Array(repeating: Array(repeating: 987654321, count: board.count), count: board.count) | |
var dirCosts = Array(repeating: costs, count: 4) | |
for i in 0..<4 { | |
dirCosts[i][0][0] = 0 | |
} | |
func isInRange(x: Int, y: Int) -> Bool { | |
return x >= 0 && x < board.count && y >= 0 && y < board.count | |
} | |
func dfs(_ x: Int, _ y: Int, _ currDir: Direction) { | |
let xDir = [0, 0, 1, -1] | |
let yDir = [1, -1, 0, 0] | |
let dirs:[Direction] = [.down, .up, .right, .left] | |
for i in 0..<4 { | |
let nextX = x + xDir[i] | |
let nextY = y + yDir[i] | |
let nextDir = dirs[i] | |
let costNext = dirCosts[currDir.rawValue][x][y] + (currDir == nextDir ? 100 : 600) | |
guard isInRange(x: nextX, y: nextY) == true, | |
dirCosts[i][nextX][nextY] > costNext else { continue } | |
dirCosts[i][nextX][nextY] = costNext | |
if board[nextX][nextY] != 1 { | |
dfs(nextX, nextY, nextDir) | |
} | |
} | |
} | |
dfs(0, 0, .up) | |
dfs(0, 0, .left) | |
dfs(0, 0, .right) | |
dfs(0, 0, .down) | |
return dirCosts.map({ $0[board.count - 1][board.count - 1] }).min() as! Int | |
} |