class Solution {
int[][] answer;
int x = 0;
int y = 0;
int num = 2;
int floor;
public int[] solution(int n) {
answer = new int[n][n];
answer[0][0]=1;
floor = n;
int sum = IntStream.rangeClosed(1, n).sum();
while (num <= sum) {
moveDown();
moveRight();
moveUp();
}
return Arrays.stream(answer)
.flatMapToInt(Arrays::stream)
.filter(i -> i != 0)
.toArray();
}
public void moveDown() {
int next = y + 1;
if (next >= floor || answer[next][x] != 0) {
return;
}
y = next;
answer[y][x] = num++;
moveDown();
}
public void moveRight() {
int next = x + 1;
if (next >= floor || answer[y][next] != 0) {
return;
}
x = next;
answer[y][x] = num++;
moveRight();
}
public void moveUp() {
int nextX = x - 1;
int nextY = y - 1;
if (nextX < 0 || nextX >= floor || nextY < 0 || nextY >= floor || answer[nextY][nextX] != 0) {
return;
}
x = nextX;
y = nextY;
answer[nextY][nextX] = num++;
moveUp();
}
}
이차원 배열을 선언한다. 이 때 move를 어떻게 하냐에 따라 처리하는 로직을 달리해준다.
- 회전하면서 돌기 위해 while문으로 move를 해준다. 이 때 순서를 맞춰서 해줘야 한다. down -> right -> up
- 이미 지나갔거나 범위가 넘어가지는 않는지를 확인해준다 넘어가기전에 멈추게 해준다.
- 위 과정을 반복한다.
사실 처음에는 감이 잡히지 않았다. 수학적으로 풀려다 보니 시간이 많이 걸렸다. 결국 힌트를 보았는데 2차원 배열을 보자마자 위 아이디어가 떠올랐다. 아직 갈길이 멀다.😭