LeetCode: 59(스파이럴 매트릭스 II)(JAVA)

문제가 있는 링크

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

스파이럴 매트릭스 II – LeetCode

이 실제 인터뷰 질문을 해결할 수 있습니까? 나선형 행렬 II – 양의 정수 n이 주어지면 1에서 n2까지의 요소를 나선형 순서로 채우는 nxn 행렬을 생성합니다.

예 1: (https://assets.leetcode.com/uploads/2020/11/13/spiraln.jpg) 입력: n = 3 O

leetcode.com

설명

전체 솔루션 프로세스는 다음과 같습니다.

  1. 크기 n이 주어진 nxn 크기의 2차원 배열 선언
  2. 한 번에 이동할 크기, 현재 행과 열을 지정할 변수, 이동할 양, 삽입할 값을 선언합니다.

  3. 열 -> 행 이동은 while 문에 의해 반복되어 배열을 나선형으로 채웁니다.


    1) Size만큼 반복하여 열을 이동하고 해당 위치에 값을 저장합니다.


    2) 사이즈 축소
    3) 가능한 한 많이 반복하여 행을 이동하고 적절한 위치에 값을 저장하십시오.
    4) 이동량의 변화
    5) 크기가 0보다 커질 때까지 위의 과정을 반복하십시오.
  4. 결과 배열을 반환합니다.

문제 유형 자체가 다소 유명하다 보니 해법이 다른 문제다.

결국 나선운동은 (열운동 -> 행운동)의 반복으로 볼 수 있다.

이동을 보면 먼저 열을 따라 +1 이동한 다음 행 이동으로 방향을 변경하여 +1 이동합니다.

그런 다음 열에서 -1만큼 아래로 이동한 다음 행에서 -1만큼 아래로 이동합니다.

결국 이전 악장은 반복되는 형태가 된다.


물론 이 시점에서 이동량에는 차이가 있습니다.

첫 번째 열을 지정된 양 n만큼 이동한 다음 행과 열을 n-1만큼 이동한 다음 행과 열을 n-만큼 이동합니다.

. 2번. 마지막으로 이동 방향은 (열, 행) 쌍으로 그룹화할 수 있지만 이동 이동량의 경우 첫 번째 열 이동을 제외하고는 (행, 열) 쌍을 그룹화해야 합니다.


그래서 while 문 전체를 이동하는 로직을 작성할 때 이동의 크기를 줄이거나 이동량(이동 방향)을 변경하는 로직을 교대로 포함해야 합니다.

먼저 한 번에 이동할 거리의 크기, 현재 위치(행과 열)를 포함하는 변수, 이동량(+1부터 시작), 저장할 값을 나타내는 개수를 선언합니다.

그리고 while 문으로 배열을 채웁니다.


먼저 열 크기를 따라 이동하며 각 위치에 값을 저장합니다.

그 후 크기를 한 번 줄이고 크기만큼 행을 이동하고 각 위치에 값을 저장합니다.

그런 다음 이동량에 -1을 곱하여 이전 이동량을 +1에서 -1로 변경합니다.

이 경우 다음 열과 행의 이동은 -1만큼 감소합니다.


그런 다음 이동 거리의 크기가 0이 될 때까지 while 문을 반복한 다음 값으로 채워진 2차원 배열 응답을 반환합니다.

class Solution {
    public int()() generateMatrix(int n) {
        int()() answer = new int(n)(n);
        int size = n, r = 0, c = -1, move = 1, count = 0;

        while (size > 0) {//이동거리가 0보다 큰 동안
            for (int i = 0; i < size; i++) {//이동거리만큼
                c += move;//열 이동
                answer(r)(c) = ++count;//그때마다 증가된 값 저장
            }
            --size;//이동거리 감소

            for (int i = 0; i < size; i++) {//이동거리만큼
                r += move;//행 이동
                answer(r)(c) = ++count;//그때마다 증가된 값 저장
            }
            move *= -1;//이동방향 변경

        }

        return answer;
    }
}

결과