Kotlin/Kotlin 알고리즘

백준 13459번 구슬탈출 Kotlin 구현해보기

kimc 2023. 9. 16. 14:31
반응형

```

백준 13459번 구슬탈출 Kotlin 구현해 보기

```

Kimc Kotlin Study

이번 글을 통해 배워갈 내용

  1. 백준 13459번 풀이

https://www.acmicpc.net/problem/13459

 

13459번: 구슬 탈출

첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B'

www.acmicpc.net

 

백준 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/

 

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 


 

반응형