[Kotlin] 릿코드 54 Spiral Matrix

송규빈·2022년 7월 4일
0

📘 문제

https://leetcode.com/problems/spiral-matrix/

💡 풀이

  1. 사각형의 외곽을 기준으로 돌린다.
  2. 한 사이클을 돌 때마다 범위를 좁혀가며 안에 있는 사각형도 순서대로 돌려준다.
    2-1. x와 y의 시작점과 끝점을 좁힌다.
    2-2. 위, 오른쪽, 아래, 왼쪽 순으로 돌려준다.

  1. 주의할 점은 겹치는 부분이다.
    아래의 그림 모양의 사각형이 생긴다면, top(6,7)과 bottom(6)이 겹칠 수도 있고, 가로 & 세로 모양이 바뀐다면 left와 right가 겹칠 수도 있다.
    이를 해결하기 위해 방문 배열을 사용할 수도 있지만, 탐색하는 시작점, 끝점이 같을 경우 종료시켰다.

💻 코드

class Solution {

    fun spiralOrder(matrix: Array<IntArray>): List<Int> {        
    val answer = mutableListOf<Int>()
    var startX = 0
    var endX = matrix.size
    var startY = 0
    var endY = matrix[0].size

    while (startX < endX && startY < endY) {
        cycleMove(startX, startY, endX, endY, answer, matrix)
        startX++
        endX--
        startY++
        endY--
    }

    return answer
}
    private fun cycleMove(
    startX: Int,
    startY: Int,
    endX: Int,
    endY: Int,
    answer: MutableList<Int>,
    matrix: Array<IntArray>
) {
    // top
    for (i in startY until endY) answer.add(matrix[startX][i])

    // right
    for (i in startX + 1 until endX) answer.add(matrix[i][endY - 1])

    if (endX - 1 == startX || startY == endY - 1) return

    // bottom
    for (i in endY - 2 downTo startY) answer.add(matrix[endX - 1][i])

    // left
    for (i in endX - 2 downTo startX + 1) answer.add(matrix[i][startY])
}
}

결과

profile
🚀 상상을 좋아하는 개발자

0개의 댓글