문제가 있는 링크
https://leetcode.com/problems/spiral-matrix-ii/
설명
전체 솔루션 프로세스는 다음과 같습니다.
- 크기 n이 주어진 nxn 크기의 2차원 배열 선언
- 한 번에 이동할 크기, 현재 행과 열을 지정할 변수, 이동할 양, 삽입할 값을 선언합니다.
- 열 -> 행 이동은 while 문에 의해 반복되어 배열을 나선형으로 채웁니다.
1) Size만큼 반복하여 열을 이동하고 해당 위치에 값을 저장합니다.
2) 사이즈 축소
3) 가능한 한 많이 반복하여 행을 이동하고 적절한 위치에 값을 저장하십시오.
4) 이동량의 변화
5) 크기가 0보다 커질 때까지 위의 과정을 반복하십시오. - 결과 배열을 반환합니다.
문제 유형 자체가 다소 유명하다 보니 해법이 다른 문제다.
결국 나선운동은 (열운동 -> 행운동)의 반복으로 볼 수 있다.
이동을 보면 먼저 열을 따라 +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;
}
}
결과