링크 : https://www.acmicpc.net/problem/1913

 

1913번: 달팽이

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

www.acmicpc.net


소스코드 (Implement)

import java.io.BufferedReader
import java.io.FileInputStream
import java.io.InputStreamReader
import kotlin.math.pow

private val MY = arrayOf(-1,0,1,0)//아래,우,위,좌
private val MX = arrayOf(0,1,0,-1)//아래,우,위,좌

private var N = 0 //홀수인 자연수 N(3 ≤ N ≤ 999)
private var target = 0 //N^2 이하의 자연수
private lateinit var map : Array<IntArray>
private lateinit var targetIndex :String

private fun main(){
    val br = BufferedReader(InputStreamReader(System.`in`))
    N = br.readLine().toInt()
    map = Array(N){ IntArray(N){ 0 } }
    target = br.readLine().toInt()

    makeSnail()
    for (i in map.indices){
        println(map[i].joinToString(" "))
    }
    println(targetIndex) //좌표는 1부터 시작
}
private fun makeSnail(){
    var cachedStraightCount = 1 //2번 직진하면 직진 칸 수 +1 증가
    var straightCount = 1 //2번 직진하면 직진 칸 수 +1 증가
    var y = N/2
    var x = N/2
    var value = 1 //칸 옮길 때 마다 증가,
    var direction = 0 //straightCount가 0이 될 때마다 방향 전환
    var directionChangeCount = 0
    map[y][x] = value
    targetIndex = "${y+1} ${x+1}"

    while (true){
        y += MY[direction % 4]
        x += MX[direction % 4]

        map[y][x] = ++value
        if (value == target) targetIndex = "${y+1} ${x+1}"
        straightCount-- // 칸 이동 시 감소

        if (value == N.toDouble().pow(2.0).toInt()) break

        if (straightCount == 0){
            direction++ ////straightCount가 0이 될 때마다 방향 전환
            directionChangeCount++
            straightCount = cachedStraightCount
        }
        if (directionChangeCount == 2){
            straightCount++
            cachedStraightCount = straightCount
            directionChangeCount = 0
        }
    }
}

'Algorithm_Kotlin' 카테고리의 다른 글

[Kotlin] BOJ2116 주사위 쌓기  (0) 2023.04.04
[Kotlin] BOJ1966 프린터 큐  (1) 2023.03.10
[Kotlin] BOJ1063 킹  (1) 2023.03.06
[Kotlin] BOJ14719 빗물  (0) 2023.02.27
[Kotlin] BOJ1553 도미노 찾기  (0) 2023.02.25