본문 바로가기

알고리즘/다시 봐야할 것들

백준 - 배열 돌리기1(Kotlin) 답지 보고 품

본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.

https://github.com/ROUTINE-STUDY/Algorithm

 

저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.

 

GitHub - ROUTINE-STUDY/Algorithm: 초보 알고리즘 스터디 / 누구나 참여 가능

초보 알고리즘 스터디 / 누구나 참여 가능 :runner:. Contribute to ROUTINE-STUDY/Algorithm development by creating an account on GitHub.

github.com

문의는 댓글 바람.

 

문제 출처 :https://www.acmicpc.net/problem/16926

 

[문제 설명]

풀기 싫어서 미루고 미룬 문제인데 어려웠습니다.

일단 돌리는 방법을 상상도 못한 게 가장 큽니다.

다음에 다시 풀어봐야겠습니다.

 

[접근 방법]

import java.io.BufferedReader
import java.io.InputStreamReader

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val dy = intArrayOf(0,1,0,-1)
    val dx = intArrayOf(1,0,-1,0)
    val (N,M,R) = readLine().split(" ").map {it.toInt()}
    val array = Array(N){IntArray(M)}
    repeat(N) {
        array[it] = readLine().split(" ").map { it.toInt()}.toIntArray()
    }

    var cntOfRepeatedSquare = N.coerceAtMost(M)/2
    var k = 0
    while (cntOfRepeatedSquare-- > 0) {
        var remainRotateNum = R
        val rowSize = N-1-k
        val columnSize = M-1-k

        while (remainRotateNum > 0) {
            val firstNum = array[k][k]
            var currentY = k
            var currentX = k
            var directionIdx = 0
            while (directionIdx < 4) {
                val nextDy = currentY + dy[directionIdx]
                val nextDx = currentX + dx[directionIdx]
                // 범위 안이면 이동
                if (nextDy in k..rowSize && nextDx in k..columnSize) {
                    array[currentY][currentX] = array[nextDy][nextDx]
                    currentX = nextDx
                    currentY = nextDy
                } else {
                    directionIdx++
                }
            }
            array[k+1][k] = firstNum
            remainRotateNum--
        }

        k++
    }

    val sb = StringBuilder()
    array.forEachIndexed{ index, ints ->
        ints.forEach {
            sb.append(it).append(" ")
        }
        sb.append("\n")
    }
    println(sb)
}

[내 답안 수정하기]

 

728x90
반응형