Spiral Matrix

HS K·2023년 5월 8일

문제설명

Given an m x n matrix, return all elements of the matrix in spiral order.

제한사항

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • 100 <= matrix[i][j] <= 100

입출력 예

Example 1:

https://assets.leetcode.com/uploads/2020/11/13/spiral1.jpg

Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]

Example 2:

https://assets.leetcode.com/uploads/2020/11/13/spiral.jpg

Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

행동영역(알고리즘을 설계하는 사고과정)

  1. 규칙 알고리즘화 하기
    규칙은 눈에 쉽게 보인다. 하지만 알고리즘화 하는게 관건이다.
    그래서 어떻게 알고리즘을 할지 살펴보다가 오른쪽, 왼쪽을 보았을때 각 열 또는 행마다 각 1줄씩 살펴본다면 규칙이 눈에 보인다.
    따라서 위, 아래, 오른쪽, 왼쪽으로 나눠서 알고리즘을 만들기로 했다.
  1. 매서드 선정
    어떤 매서드를 써야할지 감이 잘 잡히지 않았다.

내가 쓴 답

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
     let result = [];
    while (matrix.length) {
        // Add the first row
        result = result.concat(matrix.shift());
        
        // Add the rightmost column
        for (let i = 0; i < matrix.length; i++) {
            let row = matrix[i];
            if (row.length) {
                result.push(row.pop());
            }
        }

        // Add the last row in reverse order
        let lastRow = matrix.pop();
        if (lastRow) {
            result = result.concat(lastRow.reverse());
        }

        // Add the leftmost column in reverse order
        for (let i = matrix.length - 1; i >= 0; i--) {
            let row = matrix[i];
            if (row.length) {
                result.push(row.shift());
            }
        }
    }
    return result;
};

다른풀이

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
    let res = [];

    while(matrix.length) {
        let curr = matrix.shift();
        res.push(...curr);
        for(let row of matrix) {
            let end = row.pop();
            if(end) {
                res.push(end);
                row.reverse()
            }
        }
        matrix.reverse();
    }
    return res;
};

reverse() 매서드까지 쓸 줄은 몰랐다.

속도 백분위

피드백

shift()와 pop() 메서드를 써야한다는 것은 떠올렸지만 반환결과가 제거된 배열을 반환한다는 사실을 생각하지 못해서 쓰지 않고 다른 방법을 시도했다. 애매할땐 찾아보고 직접 해보는게 가장 중요하다.

profile
주의사항 : 최대한 정확하게 작성하려고 하지만, 틀릴내용이 있을 수도 있으니 유의!

0개의 댓글