[백준] 미로 만들기 (1347)(kotlin)

문제 설명

백준 1347번 문제 링크

입력 및 출력

» 입력

첫째 줄에 홍준이가 적은 내용의 길이가 주어진다. 길이는 0보다 크고, 50보다 작다. 둘째 줄에 그 내용이 주어진다.

» 출력

첫째 줄에 미로 지도를 출력한다. ‘.’은 이동할 수 있는 칸이고, ‘#’는 벽이다.

예제 입출력(테스트케이스)

입력 출력
5
RRFRF
..
.#

문제 풀이1

import kotlin.math.abs

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val dx = intArrayOf(0, -1, 0, 1)
    val dy = intArrayOf(-1, 0, 1, 0)

    val n = readLine().toInt()
    val move = readLine()

    val x = mutableListOf<Int>(0)
    val y = mutableListOf<Int>(0)

    var prevX = 0
    var prevY = 0
    var prevD = 0

    move.forEach {
        when (it) {
            'L' -> prevD = if (prevD - 1 < 0) 3 else prevD - 1
            'R' -> prevD = if (prevD + 1 > 3) 0 else prevD + 1
            'F' -> {
                prevX += dx[prevD]
                prevY += dy[prevD]
                x.add(prevX)
                y.add(prevY)
            }
        }
    }

    val xMin = x.minOf { it }
    val xMax = x.maxOf { it }
    val yMin = y.minOf { it }
    val yMax = y.maxOf { it }
    
    val xShift = if(xMin < 0) abs(xMin) else 0
    val yShift = if(yMin < 0) abs(yMin) else 0

    val map = Array(yMax - yMin + 1) { BooleanArray(xMax - xMin + 1) { false } }

    for (i in x.indices) {
        map[y[i] + yShift][x[i] + xShift] = true
    }

    for (i in map.size - 1 downTo 0) {
        println(map[i].joinToString("") { if (it) "." else "#" })
    }
}

문제 풀이2

import kotlin.math.abs

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val dx = intArrayOf(0, -1, 0, 1)
    val dy = intArrayOf(-1, 0, 1, 0)

    val n = readLine().toInt()
    val move = readLine()

    val x = mutableListOf<Int>(0)
    val y = mutableListOf<Int>(0)

    var prevX = 0
    var prevY = 0
    var prevD = 0

    move.forEach {
        when (it) {
            'L' -> prevD = (prevD + 3) % 4
            'R' -> prevD = (prevD + 1) % 4
            'F' -> {
                prevX += dx[prevD]
                prevY += dy[prevD]
                x.add(prevX)
                y.add(prevY)
            }
        }
    }

    val xMin = x.minOf { it }
    val xMax = x.maxOf { it }
    val yMin = y.minOf { it }
    val yMax = y.maxOf { it }

    val xShift = if(xMin < 0) abs(xMin) else 0
    val yShift = if(yMin < 0) abs(yMin) else 0

    val map = Array(yMax - yMin + 1) { BooleanArray(xMax - xMin + 1) { false } }

    for (i in x.indices) {
        map[y[i] + yShift][x[i] + xShift] = true
    }

    for (i in map.size - 1 downTo 0) {
        println(map[i].joinToString("") { if (it) "." else "#" })
    }
}