class Solution {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int num = 1; // 배열에 채워질 정수 값
int rowStart = 0; // 행의 시작 인덱스
int rowEnd = n - 1; // 행의 끝 인덱스
int colStart = 0; // 열의 시작 인덱스
int colEnd = n - 1; // 열의 끝 인덱스
while (num <= n * n) {
// 왼쪽 -> 오른쪽
for (int i = colStart; i <= colEnd; i++) {
answer[rowStart][i] = num++;
}
rowStart++; // 행의 시작 인덱스 증가
// 위쪽 -> 아래쪽
for (int i = rowStart; i <= rowEnd; i++) {
answer[i][colEnd] = num++;
}
colEnd--; // 열의 끝 인덱스 감소
// 오른쪽 -> 왼쪽
for (int i = colEnd; i >= colStart; i--) {
answer[rowEnd][i] = num++;
}
rowEnd--; // 행의 끝 인덱스 감소
// 아래쪽 -> 위쪽
for (int i = rowEnd; i >= rowStart; i--) {
answer[i][colStart] = num++;
}
colStart++; // 열의 시작 인덱스 증가
}
return answer;
}
}
num이 n * n보다 작거나 같을 때까지 반복문을 실행합니다. 반복문은 배열을 나선형으로 채우기 위한 과정을 수행합니다.
왼쪽에서 오른쪽으로 이동합니다. colStart부터 colEnd까지 반복하면서 answer[rowStart][i]에 num 값을 대입합니다.
왼쪽 위에서 아래쪽으로 이동합니다. rowStart + 1부터 rowEnd까지 반복하면서 answer[i][colEnd]에 num 값을 대입합니다.
오른쪽에서 왼쪽으로 이동합니다. colEnd - 1부터 colStart까지 반복하면서 answer[rowEnd][i]에 num 값을 대입합니다.
오른쪽 아래에서 위쪽으로 이동합니다. rowEnd - 1부터 rowStart + 1까지 반복하면서 answer[i][colStart]에 num 값을 대입합니다.
행과 열의 시작과 끝 인덱스를 조정하여 다음 회전을 위한 준비를 합니다.
완성된 answer 이차원 배열을 반환합니다.