๋ฌธ์ ์ค๋ช
์ฒด์คํ ์์ ํ ๋์ดํธ๊ฐ ๋์ฌ์ ธ ์๋ค. ๋์ดํธ๊ฐ ํ ๋ฒ์ ์ด๋ํ ์ ์๋ ์นธ์ ์๋ ๊ทธ๋ฆผ์ ๋์์๋ค. ๋์ดํธ๊ฐ ์ด๋ํ๋ ค๊ณ ํ๋ ์นธ์ด ์ฃผ์ด์ง๋ค. ๋์ดํธ๋ ๋ช ๋ฒ ์์ง์ด๋ฉด ์ด ์นธ์ผ๋ก ์ด๋ํ ์ ์์๊น?
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค.
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ์ธ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฒซ์งธ ์ค์๋ ์ฒด์คํ์ ํ ๋ณ์ ๊ธธ์ด 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 ๋ฐฐ์ด์ ์์ฑํด์ฃผ๋ ค๊ณ ํ ๋ถ๋ถ์์ ์กฐ๊ธ ์๊ฐ์ด ์ง์ฒด๋์๊ณ , ๋๋จธ์ง๋ ์ด์ ์ ํ์๋ ๋ฌธ์ ๋ค๊ณผ ๋น์ทํด์ ๊ธ๋ฐฉ ํ์ด๋ผ ์ ์์๋ค.
๋ฌธ์
'3๏ธโฃ Swift > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift Algorithm] 1๋ก ๋ง๋ค๊ธฐBOJ #1463 (0) | 2021.10.19 |
---|---|
[Swift Algorithm] ์์ ์์ญ BOJ #2468 (2) | 2021.10.12 |
[Swift Algorithm] ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ BOJ #2667 (0) | 2021.10.10 |
[Swift Algorithm] ์์ญ ๊ตฌํ๊ธฐ BOJ #2583 (0) | 2021.10.10 |
[Swift Algorithm] ํ ๋งํ BOJ #7659 (0) | 2021.10.08 |
๋๊ธ