class Solution {
public int[] solution(int n) {
int[] answer = {};
int x = 0;
int y = 0;
int cnt = 1;
int phase = 0;
long[][] arr = new long[n][n];
arr[y][x] = cnt++;
while (true) {
// 아래로 이동
while (y + 1 < n) {
if (arr[y + 1][x] == 0) {
y++;
} else {
break;
}
arr[y][x] = cnt++;
}
// 오른쪽으로 이동
while (x + 1 < n) {
if (arr[y][x + 1] == 0) {
x++;
} else {
break;
}
arr[y][x] = cnt++;
}
// 왼쪽 대각선으로 이동
while (x > 1 && y > 1) {
if (arr[y - 1][x - 1] == 0) {
y--;
x--;
} else {
break;
}
arr[y][x] = cnt++;
}
phase++;
if (y + 1 >= n) {
break;
} else if(arr[y + 1][x] != 0) {
break;
}
}
answer = new int[cnt - 1];
int index = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
if ((int) arr[i][j] != 0) {
answer[index++] = (int) arr[i][j];
}
}
}
return answer;
}
}
(중복된 코드 수정 및 개선 버전)
class Solution {
public boolean checkRange(int x, int y, int n) {
if (x < 0 || x >= n || y < 0 || y >= n) {
return false;
}
return true;
}
public int[] solution(int n) {
int[] answer = {};
// 1. 아래로 이동 / 2. 오른쪽으로 이동 / 3. 왼쪽 대각선으로 이동
int[] dx = {0, 1, -1};
int[] dy = {1, 0, -1};
int x = 0;
int y = 0;
int it = 0;
long num = 1;
long[][] arr = new long[n][n];
arr[y][x] = num;
while (true) {
// 삼각형 돌기 반복
while (true) {
int nextX = x + dx[it];
int nextY = y + dy[it];
// java에서는 왼쪽 조건부터 평가하고 왼쪽조건이 false인 경우 오른쪽 조건을 평가하지 않는다.
if (checkRange(nextX, nextY, n) && arr[nextY][nextX] == 0) {
num++;
arr[nextY][nextX] = num;
x = nextX;
y = nextY;
} else {
break;
}
}
it = (it + 1) % 3;
int nextX = x + dx[it];
int nextY = y + dy[it];
if (checkRange(nextX, nextY, n) && arr[nextY][nextX] == 0) {
num++;
arr[nextY][nextX] = num;
x = nextX;
y = nextY;
} else {
break;
}
}
// 정답 저장
answer = new int[(int)num];
int index = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (arr[i][j] != 0) {
answer[index++] = (int)arr[i][j];
}
}
}
return answer;
}
}