반응형
```
백준 13459번 구슬탈출 Kotlin 구현해 보기
```
이번 글을 통해 배워갈 내용
- 백준 13459번 풀이
https://www.acmicpc.net/problem/13459
백준 13459번 제목은
판을 시뮬레이션하고
파란 구슬, 빨간 구슬, 구멍이 있을 때
판을 좌, 우, 상, 하로 움직여서
파란 구슬을 구멍에 넣지 않고
빨간 구슬을 구멍에 넣어 준다고 가정하고
10번 이하로 판을 움직여서 빨간 구슬 구멍에 넣을수 있는지 판별해주면 됩니다
30분 정도 위에 링크를 방문하셔서 풀어보시고
안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
입력을 받고
정해진 조건에 맞춰서 계산을 해서 출력해 주면 되는
문제입니다.
// https://www.acmicpc.net/problem/13460
fun main() {
val inputDto = getInput()
print(solution(inputDto))
}
fun getInput(): InputDto {
val (rows, cols) = readLine()!!.split(" ").map { it.toInt() }
val locationMap = Array(rows) { Array(cols) { ' ' } }
val visitMap = Array(rows) { Array(cols) { Array(rows) { Array(cols) { false } } } }
var rx = 0
var ry = 0
var bx = 0
var by = 0
val inputLines = List(rows) { readLine()!! }
inputLines.forEachIndexed { rowIdx, line ->
line.forEachIndexed { colIdx, char ->
locationMap[rowIdx][colIdx] = char
when (char) {
'R' -> {
rx = rowIdx; ry = colIdx
}
'B' -> {
bx = rowIdx; by = colIdx
}
}
}
}
return InputDto(Step(rx, ry, bx, by, 0), locationMap, visitMap)
}
data class Step(
var rx: Int,
var ry: Int,
var bx: Int,
var by: Int,
var count: Int
)
data class InputDto(
val step: Step,
val locationMap: Array<Array<Char>>,
val visitMap: Array<Array<Array<Array<Boolean>>>>
) {
private val dx = intArrayOf(1, -1, 0, 0)
private val dy = intArrayOf(0, 0, 1, -1)
fun bfs(step: Step): Int {
val q = ArrayDeque<Step>()
q.add(step)
visitMap[step.rx][step.ry][step.bx][step.by] = true
while (q.isNotEmpty()) {
val currentStep = q.removeFirst()
val (rx, ry, bx, by, count) = currentStep
if (count >= 10) break
for (i in 0 until 4) {
var (nrx, nry, rc) = moveBall(rx, ry, i)
var (nbx, nby, bc) = moveBall(bx, by, i)
if (locationMap[nbx][nby] == 'O') continue
if (locationMap[nrx][nry] == 'O') return 1
if (nrx == nbx && nry == nby) {
if (rc > bc) {
nrx -= dx[i]
nry -= dy[i]
} else {
nbx -= dx[i]
nby -= dy[i]
}
}
if (visitMap[nrx][nry][nbx][nby]) continue
visitMap[nrx][nry][nbx][nby] = true
q.addLast(Step(nrx, nry, nbx, nby, count + 1))
}
}
return 0
}
private fun moveBall(x: Int, y: Int, i: Int): Triple<Int, Int, Int> {
var nx = x
var ny = y
var cnt = 0
while (
locationMap[nx + dx[i]][ny + dy[i]] != '#'
&& locationMap[nx][ny] != 'O'
) {
nx += dx[i]
ny += dy[i]
cnt++
}
return Triple(nx, ny, cnt)
}
}
fun solution(dto: InputDto): Int {
return dto.bfs(dto.step)
}
// https://codemasterkimc.tistory.com/
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
반응형
'Kotlin > Kotlin 알고리즘' 카테고리의 다른 글
백준 15644번 구슬탈출3 Kotlin 구현해 보기 (0) | 2023.09.16 |
---|---|
백준 13460번 구슬탈출2 Kotlin 구현해보기 (0) | 2023.09.16 |
백준 27294번 몇개고? Kotlin 구현해보기 (0) | 2023.09.13 |
백준 27433번 팩토리얼 2 Kotlin 구현해보기 (0) | 2023.09.12 |
백준 18258번 큐 2 Kotlin 구현해보기 (0) | 2023.09.09 |