본 문제는 2차원 배열을 아래 - 오른쪽 - 왼쪽 위 (반시계) 순으로 탐색하는 풀이를 통해 해결할 수 있다. 방향 전환의 경우 아래, 오른쪽, 왼쪽 위 까지 총 3가지 경우이므로 % 연산자를 통해 3개의 방향 case를 반복하여 방향이 전환되는 경우 좌표 변수를 갱신하고 올바른 방향으로 이동하도록 한다.
마지막으로, 더 이상 전환된 방향으로도 이동이 불가한 경우에는 break문을 설정함으로써 문제 조건에 맞는 모든 숫자를 2차원 배열에 선언할 수 있다. 코드는 아래와 같다.
import java.util.*;
class Solution {
private static final int dx[] = {0,1,-1};
private static final int dy[] = {1,0,-1};
public int[] solution(int n) {
int[][] answer = new int[n][n];
int x =0;
int y =0;
int i = 1;
int d = 0;
while(true){
answer[y][x] = i++;
int nx = x + dx[d];
int ny = y + dy[d];
if (ny == n || nx == n || answer[ny][nx] != 0 ){
//방향 전환
d = (d+1) % 3;
nx = x + dx[d];
ny = y + dy[d];
//전환된 방향으로도 진행을 하지 못하는 경우 : 마지막 숫자의 경우
if(ny == n || nx == n || answer[ny][nx] != 0 ) break;
}
x = nx;
y = ny;
}
int result[] = new int[i-1];
int idx = 0;
for (int k =0; k< n; k++){
for (int j = 0; j <= k; j++){
result[idx++] = answer[k][j];
}
}
return result;
}
}