[백준] 달팽이 (1913)(kotlin)

문제 설명

백준 1913번 문제 링크

입력 및 출력

» 입력

첫째 줄에 홀수인 자연수 N이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.

» 출력

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.

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

입력 출력
7
35
49 26 27 28 29 30 31
48 25 10 11 12 13 32
47 24 9 2 3 14 33
46 23 8 1 4 15 34
45 22 7 6 5 16 35
44 21 20 19 18 17 36
43 42 41 40 39 38 37
5 7
4
16
16 5 6 7
15 4 1 8
14 3 2 9
13 12 11 10
1 1

문제 풀이1

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 target = readLine().toInt()
    val route = Array(N) { IntArray(N) { 0 } }
    val max = N * N

    var direction = 0
    var x = 0
    var y = 0
    var targetX = 1
    var targetY = 1
    route[y][x] = max

    for (i in (max - 1) downTo 1) {
        var nx = x + dx[direction]
        var ny = y + dy[direction]

        if (nx in 0 until N && ny in 0 until N) {
            if (route[ny][nx] == 0) {
                route[ny][nx] = i
            } else {
                if (direction == 3) {
                    direction = 0
                } else {
                    direction++
                }
                nx = x + dx[direction]
                ny = y + dy[direction]
                route[ny][nx] = i
            }
        } else {
            if (direction == 3) {
                direction = 0
            } else {
                direction++
            }
            nx = x + dx[direction]
            ny = y + dy[direction]
            route[ny][nx] = i
        }

        if (target == i) {
            targetY = ny + 1
            targetX = nx + 1
        }
        x = nx
        y = ny
    }

    route.forEach {
        println(it.joinToString(" "))
    }

    println("$targetY $targetX")
}