๋ฐฑ์ค - ์๊ธฐ ์์ด(Swift)
2022. 11. 30. 14:44ใAlgorithm
๋ฐฑ์ค - ์๊ธฐ ์์ด(Swift)
๋ฌธ์ ์ค๋ช
https://www.acmicpc.net/problem/16236
๋์ ํ์ด
๋ค๋ฅธ ๋ถ์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ง๋ง ์ด์ ์ด๋ฐ ๋ฌธ์ ๋ ํ ์ค ์์์ผํ๋ค.
์๊ธฐ์์ด์ ์์น์์ ์ต์์ ์์น๋ฅผ ์ฐพ๋ ๊ฒ์ BFS์ด๋ฉฐ 2์ฐจ์ ๋ฐฐ์ด์ ๊ธฐ์กด์ ๋ฐฐ์ด, ๊ทผ์ ํ ๋ฌผ๊ณ ๊ธฐ๋ค์ ๋ฐฐ์ด์ ์ ์ธํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํ์๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ์ ๊ฒฝ์ฐ์๋ ์์ ์ด๋ ํ ๋ก์ง๋ ๊ฑฐ์น์ง ์์์ผ๋ก์จ ๋ฌด์ํ๊ณ ์ง๋๊ฐ ์ ์๊ฒ ๋ง๋ค์๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฐฉ๋ฌธํ์๋ฅผ ํ๋ ์ด์ ๋ ๊ทธ ๊ฑฐ๋ฆฌ๊น์ง๋ ์ด๋ฏธ ์ต์์ด๊ธฐ ๋๋ฌธ์ ๋ ๊ฐฑ์ ํ์ง ๋ง์์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. (๋ฐฉ๋ฌธํ์๋ 0์ด ์๋๋ผ๋ฉด ๋ฐฉ๋ฌธํ์๊ฐ ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค)
import Foundation
let N = Int(readLine()!)!
let dx = [-1, 0, 1, 0]
let dy = [0, -1, 0, 1]
var arr = [[Int]]()
var shark = (0, 0)
var queue = [(Int, Int)]()
var distance = [[Int]]()
var fish = [(Int, Int, Int)]()
var result = 0
var size = 2
var exp = 0
let xRange = 0..<N
let yRange = 0..<N
for _ in 0..<N {
arr.append(readLine()!.components(separatedBy:" ").map{Int($0)!})
}
for i in 0..<N {
for j in 0..<N {
if arr[i][j] == 9 {
shark = (i, j)
arr[i][j] = 0
}
}
}
func BFS() {
var index = 0
distance[shark.0][shark.1] = 1 // ์์ด๊ฐ ์๋ ๊ณณ์ ๋ฐฉ๋ฌธํ์
queue.append((shark.0, shark.1))
while index < queue.count {
let cur = queue[index]
index += 1
for i in 0..<4 {
var nx = cur.0 + dx[i]
var ny = cur.1 + dy[i]
// ๋ฒ์์์ ์๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒ๋ค์ ๋ํด์๋ง ํ์
if xRange ~= nx, yRange ~= ny, distance[nx][ny] == 0 {
// ๋ฌผ๊ณ ๊ธฐ๊ฐ ์กด์ฌํ๊ณ ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ ํ์ฌ ์์ด๋ณด๋ค ์๋ค๋ฉด
if arr[nx][ny] != 0, arr[nx][ny] < size {
distance[nx][ny] = distance[cur.0][cur.1] + 1
fish.append((nx, ny, distance[nx][ny]))
}
// ๋ฌผ๊ณ ๊ธฐ๊ฐ ์กด์ฌํ์ง์๊ฑฐ๋ ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ ํ์ฌ ์์ด์ ํฌ๊ธฐ๊ฐ ๊ฐ๋ค๋ฉด
if arr[nx][ny] == 0 || arr[nx][ny] == size {
distance[nx][ny] = distance[cur.0][cur.1] + 1
queue.append((nx, ny))
}
}
}
}
}
while true {
queue = [(Int, Int)]()
distance = Array(repeating: Array(repeating: 0, count: N), count: N)
fish = [(Int, Int, Int)]()
BFS()
if fish.isEmpty {
print(result)
break
}
fish = fish.sorted { $0.2 == $1.2 ?
( $0.0 == $1.0 ? $0.1 < $1.1 : $0.0 < $1.0) :
$0.2 < $1.2 }
shark = (fish[0].0, fish[0].1) // ์์ด ํ์ฌ์์น ๋ณ๊ฒฝ
exp += 1
if size == exp { size += 1; exp = 0 } // ๊ฒฝํ์น๊ฐ ๋๋ฌํใท์๋ฉด size๋ฅผ ํค์ด๋ค.
arr[fish[0].0][fish[0].1] = 0 // ์์ด๊ฐ ๋๋ฌํ์ผ๋ ํด๋น์๋ฆฌ๋ฅผ 0์ผ๋ก ๋ฆฌ์
result += (fish[0].2 - 1) // ์๊ธฐ์์ด์์ ๋ฌผ๊ณ ๊ธฐ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๊ฐ. 1์ ๋นผ๋ ์ด์ ๋ ๋ฐฉ๋ฌธํ์๋ฅผ ์ํด ์ฒ์์ 1์ ์ค์ ํ๊ธฐ ๋๋ฌธ
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค - ์์ด ์ฌ์ดํด(Swift) (0) | 2022.12.03 |
---|---|
๋ฐฑ์ค - ๊ธฐ์ฐจ๊ฐ ์ด๋ ์ ํค์น๊ณ ์ํ์๋ฅผ(Swift) (0) | 2022.12.02 |
๋ฐฑ์ค - ๊ฐ์(Swift) (0) | 2022.11.29 |
๋ฐฑ์ค - ๋๋๊ณค ์ปค๋ธ(Swift) (0) | 2022.11.28 |
๋ฐฑ์ค - ๋ฏธ์ธ๋จผ์ง ์๋ !(Swift) (0) | 2022.11.23 |