https://school.programmers.co.kr/learn/courses/30/lessons/181832
우선, n이 4일때를 기준으로 문제를 이해해 보자.
첫 번째 for문을 보면 같은 행에서 시작을 한다. 즉, 0번째 줄에서 시작하는 것이다. 0번째 줄에서 시작해서 열(세로줄)을 하나씩 채우는 것이다. 그러면 배열의 첫 번째 줄에 1,2,3,4가 들어간다. 그 다음, rowStart를 1 증가시켜 시작 행을 1 증가시켜준다.
그 다음, 두 번째 for문을 보면 맨 마지막 열에서 그 아래로 내려가는 로직이다. 그럼 맨 마지막 줄의 세로줄이 4,5,6,7이 채워진다. 그 다음 맨 마지막 열을 채웠으므로 colEnd를 1 줄여주어 끝 열을 하나 단축시켜준다.
그 다음에는 for문을 이용하여 1씩 감소시켜 반복시켜 주면 된다.
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(rowStart <= rowEnd && colStart <= colEnd){ //아직 채우지 않은 행과 열이 있는지 판단
for(int i=colStart; i<=colEnd; i++){ //세로꺼를 하나하나 채워야 함
answer[rowStart][i] = num++; //0번째 행
}
rowStart++; //행 증가
for(int i=rowStart; i<=rowEnd; i++){
answer[i][colEnd] = num++; //맨 마지막 가로줄 하나씩 채우기
}
colEnd --; //한 칸 왼쪽으로
if(rowStart <= rowEnd){
for(int i=colEnd; i>=colStart; i--){
answer[rowEnd][i] = num++; //세로 채우기
}
rowEnd --; //한 칸 오른쪽으로
}
if(colStart <= colEnd){
for(int i=rowEnd; i>=rowStart; i--){
answer[i][colStart] = num++; //가로 채우기
}
colStart ++;
}
}
return answer;
}
}