알고리즘(w.KOTLIN)/그래프(bfs, dfs, 다익스트라)
[백준][코틀린][16948] 데스 나이트
금님은님아부지
2023. 3. 15. 16:42
728x90
https://www.acmicpc.net/problem/16948
16948번: 데스 나이트
게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다. 크
www.acmicpc.net
문제 풀이
1. N X N 크기의 2차원 BooleanArray visit 를 선언하여 이미 탐색했는 지 유무를 저장한다.
2. Position data class 를 선언하고 r, c 좌표를 파라미터로 받는다.
3. DeathNight data class 를 선언하고 Position, Count(이동 횟수) 를 파라미터로 받는다.
4. BFS 로 탐색하여 Queue 에서 pop 으로 추출한 좌표가 도착지점의 좌표와 같을 경우 Count 를 Return 한다.
5. 도착 지점을 만나지 못할 경우 -1 을 Return 한다.
코드
import java.io.*
import java.util.*
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val N = br.readLine().toInt()
val (r1, c1, r2, c2) = br.readLine().split(" ").map { it.toInt() }
println("${bfs(N, Position(r1, c1), Position(r2, c2))}")
}
private fun bfs(N: Int, start: Position, end: Position): Int {
val queue = LinkedList<DeathNight>()
queue.add(DeathNight(start, 0))
val visit = Array(N) { BooleanArray(N) { false } }
visit[start.r][start.c] = true
while (queue.isNotEmpty()) {
val (cPos, cCount) = queue.pop()
//println("current $cPos, $cCount")
if (cPos.r == end.r && cPos.c == end.c) {
return cCount
}
// (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1) 로 이동 가능.
val dR = intArrayOf(-2, -2, 0, 0, 2, 2)
val dC = intArrayOf(-1, 1, -2, 2, -1, 1)
for (i in 0..5) {
val nR = cPos.r + dR[i]
val nC = cPos.c + dC[i]
// 범위 밖
if ((nR < 0 || nR >= N) || (nC < 0 || nC >= N)) continue
// 이미 탐색한 영역
if (visit[nR][nC]) continue
//println("next ($nR, $nC), $cCount")
visit[nR][nC] = true
queue.add(DeathNight(Position(nR, nC), cCount + 1))
}
}
return -1
}
private data class Position(val r: Int, val c: Int)
private data class DeathNight(val pos: Position, val count: Int)
728x90