[Swift Algorithm] λμ΄νΈμ μ΄λ BOJ #7562
λ¬Έμ μ€λͺ
체μ€ν μμ ν λμ΄νΈκ° λμ¬μ Έ μλ€. λμ΄νΈκ° ν λ²μ μ΄λν μ μλ μΉΈμ μλ κ·Έλ¦Όμ λμμλ€. λμ΄νΈκ° μ΄λνλ €κ³ νλ μΉΈμ΄ μ£Όμ΄μ§λ€. λμ΄νΈλ λͺ λ² μμ§μ΄λ©΄ μ΄ μΉΈμΌλ‘ μ΄λν μ μμκΉ?
μ λ ₯
μ λ ₯μ 첫째 μ€μλ ν μ€νΈ μΌμ΄μ€μ κ°μκ° μ£Όμ΄μ§λ€.
κ° ν μ€νΈ μΌμ΄μ€λ μΈ μ€λ‘ μ΄λ£¨μ΄μ Έ μλ€. 첫째 μ€μλ 체μ€νμ ν λ³μ κΈΈμ΄ l(4 ≤ l ≤ 300)μ΄ μ£Όμ΄μ§λ€. 체μ€νμ ν¬κΈ°λ l × lμ΄λ€. 체μ€νμ κ° μΉΈμ λ μμ μ {0, ..., l-1} × {0, ..., l-1}λ‘ λνλΌ μ μλ€. λμ§Έ μ€κ³Ό μ μ§Έ μ€μλ λμ΄νΈκ° νμ¬ μλ μΉΈ, λμ΄νΈκ° μ΄λνλ €κ³ νλ μΉΈμ΄ μ£Όμ΄μ§λ€.
μΆλ ₯
κ° ν μ€νΈ μΌμ΄μ€λ§λ€ λμ΄νΈκ° μ΅μ λͺ λ²λ§μ μ΄λν μ μλμ§ μΆλ ₯νλ€.
μ μΆλ ₯ μμ
μ λ ₯
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
μΆλ ₯
5
28
0
λ΄ λ¬Έμ νμ΄
let cases = Int(readLine()!)!
var dx = [-2, -1, 1, 2, 2, 1, -1, -2], dy = [1, 2, 2, 1, -1, -2, -2, -1] // λμ΄νΈμ μ΄λμ μν μ’νκ° λ³νλ
var result = [Int]()
// μ
λ ₯λ ν
μ€νΈ μΌμ΄μ€μ μ λ§νΌ λ°λ³΅
for _ in 0..<cases {
let n = Int(readLine()!)! // μ²΄μ€ λ³΄λ ν λ³μ κΈΈμ΄
let start = readLine()!.split(separator: " ").map({Int(String($0))!}) // μμμ
let target = readLine()!.split(separator: " ").map({Int(String($0))!}) // λͺ©μ μ§
if (start[0], start[1]) == (target[0], target[1]) { result.append(0) } // μ²μλΆν° μμμ κ³Ό λͺ©μ μ§κ° κ°μ κ²½μ° λ°λ‘ resultμ 0μΆκ°
else {
let target_check = (target[0], target[1]) // λͺ©μ μ§λ₯Ό ννλ‘ μμ±
var queue = [(start[0], start[1])] // ν μμ±, μμμ μ ννλ‘ λ§λ€μ΄μ λ£μ΄μ£ΌκΈ°
var board = Array(repeating: Array(repeating: 0, count: n), count: n) // κ²½λ‘λ§λ€ κ±Έλ¦° μκ°μ λμ ν΄μ£Όλ©΄μ 체ν¬νκΈ° μν 보λ λ°°μ΄
var arrive = 0 // λͺ©μ μ§μ λμ°©νλμ§ μνλμ§ μ²΄ν¬νκΈ° μν¨ (0μ΄λ©΄ λμ°©x)
var index = 0
while !queue.isEmpty {
let (x, y) = queue[index]
index += 1
for i in 0..<8 {
let dx = x + dx[i]
let dy = y + dy[i]
if dx < 0 || dy < 0 || dx >= n || dy >= n || board[dx][dy] != 0 { continue } // μμΈ
board[dx][dy] = board[x][y] + 1 // ν΄λΉ μ리κΉμ§ κ±Έλ¦° μκ° λμ
if target_check == (dx, dy) { arrive = board[dx][dy]; break } // νμν μλ¦¬κ° λͺ©μ μ§μ κ°μ κ²½μ°
queue.append((dx, dy)) // μλ κ²½μ° νμ μΆκ°
}
if arrive != 0 { result.append(arrive); break } // arriveκ° 0μ΄ μλ κ²½μ° (λͺ©μ μ§μ λμ°©)
}
}
}
print(result.map({String($0)}).joined(separator: "\n"))
π bfs λ¬Έμ λ‘, λμ΄νΈκ° μ΄λν μ μλ λͺ¨λ κ²½μ°μ μλ₯Ό κ³ λ €ν΄μ£Όλκ² ν¬μΈνΈ!
- μ§κΈκΉμ§ νμλ bfs λ¬Έμ λ€κ³Ό μ΄ λ¬Έμ μ κ°μ₯ ν° μ°¨μ΄μ μ,
λμ΄νΈλ μνμ’μ° νμμ΄μλλΌ μ΄ 8κ°μ§μ κ²½λ‘λ₯Ό νμν΄μ€μΌνλ€λ κ²μ΄λ€.
λ°λΌμ κ·Έμ λ§λ μ’ν λ³νλμ λ£μ΄μ dx, dy λ°°μ΄μ μμ±ν΄μ£Όμλ€. - μ°μ ifλ‘ μ²μλΆν° μμμ κ³Ό λͺ©μ μ§κ° κ°μ κ²½μ°λ₯Ό μμΈλ‘ λΉΌμ£Όμλ€.
κ·Έλ¦¬κ³ κ·Έ μΈμ κ²½μ°μλ bfs νμμ μμνλ€. - whileλ¬ΈμΌλ‘ bfs νμμ ν΄μ£Όμκ³ , index λ³μλ₯Ό μ΄μ©ν΄μ νλ₯Ό λ€λ€λ€.
λμ΄νΈκ° μ΄λν μ μλ κ²½λ‘λ μ΄ 8κ°μ΄λ―λ‘ whileλ¬Έ μμ forλ¬ΈμΌλ‘ 8λ² λ°λ³΅ν΄μ£Όμλ€. - forλ¬Έμμλ dx, dy λ°°μ΄μ μ΄μ©νμ¬ λ€μ νμ μμΉλ₯Ό κ²°μ νκ³ , κ·Έ μμΉκ° μ μ νμ§ νλ¨νλ€.
κ·Έ μμΉκ° 보λ λ°κΉ₯μ΄κ±°λ ν΄λΉ μμΉμ 0μ΄ μλ κ°μ΄ μ μ₯λμ΄μλ€λ©΄ ν΄λΉ λ°λ³΅μ μ’ λ£νλ€.
(λͺ¨λ κ²½λ‘ νμ μ ν΄λΉ μ리κΉμ§μ νμ λμ μκ°μ μ μ₯νμΌλ―λ‘, 0μ΄ μλ κ°μ΄ μ μ₯λμ΄μλ€λ λ»μ ν΄λΉ μ리λ μ΄λ―Έ νμνμ μ΄ μλ€λ μλ―Έμ΄λ€. λ°λΌμ μ€λ³΅ νμμ νΌνκΈ° μν¨!)
μμΈμ²λ¦¬μμ κ±Έλ¦¬μ§ μμλ€λ©΄ 보λ λ°°μ΄μ ν΄λΉ μμΉμ λμ λ μκ°μ μ μ₯ν΄μ£Όμκ³ ,
νμν μλ¦¬κ° λͺ©μ μ§μ κ°μ κ²½μ°μλ arrive λ³μμ λμ λ μκ°μ λ£κ³ forλ¬Έμ μ’ λ£νλ€.
μμ§ λͺ©μ μ§μ λλ¬νμ§ λͺ»νμ κ²½μ°μλ νμ λ€μ νμμ§λ₯Ό μΆκ°νκ³ μ€νμ κ³μνλ€. - μμμ arrive λ³μμ λμ λ μκ°μ΄ μ μ₯λμμ κ²½μ°μλ arriveκ° 0μ΄ μλκ²λλ―λ‘
λͺ©μ μ§μ λμ°©νκ²μΌλ‘ νλ¨νκ³ , result λ°°μ΄μ κ°μ μΆκ°νκ³ whileλ¬Έμ μ’ λ£νλ€.
π‘ νΌλλ°±
- μνμ’μ°κ° μλ μ΄ 8κ° κ²½λ‘ νμμ μν dx, dy λ°°μ΄μ μμ±ν΄μ£Όλ €κ³ ν λΆλΆμμ μ‘°κΈ μκ°μ΄ μ§μ²΄λμκ³ , λλ¨Έμ§λ μ΄μ μ νμλ λ¬Έμ λ€κ³Ό λΉμ·ν΄μ κΈλ°© νμ΄λΌ μ μμλ€.
λ¬Έμ