728x90
https://www.acmicpc.net/problem/16948
문제 풀이
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
'알고리즘(w.KOTLIN) > 그래프(bfs, dfs, 다익스트라)' 카테고리의 다른 글
[백준][코틀린][14502] 연구소 (0) | 2023.03.16 |
---|---|
[백준][코틀린][9019] DSLR (0) | 2023.03.15 |
[백준][코틀린][16928] 뱀과 사다리 게임 (0) | 2023.03.15 |
[백준][코틀린][13460] 구슬 탈출2 (0) | 2023.03.13 |
[백준][코틀린][16197] 두 동전 (0) | 2023.03.03 |