1. 문제 풀이 아이디어
- 이동 패턴을 기반으로 배열을 채우면 문제를 해결할 수 있다.
2. 나의 정답 코드
class Solution {
public int[] solution(int n) {
int[] answer = new int[n * (n + 1) / 2];
int pat = 0;
int num = 1;
int index = 0;
answer[index] = num++;
while (num <= answer.length) {
if (pat % 3 == 0) {
int count = pat == 0 ? 1 : 0;
while (index + count + pat * 2 / 3 < answer.length && answer[index + count + pat * 2 / 3] == 0) {
index += count + pat * 2 / 3;
answer[index] = num++;
count++;
}
} else if (pat % 3 == 1) {
while (index + 1 < answer.length && answer[index + 1] == 0) {
index++;
answer[index] = num++;
}
} else {
int count = 0;
while (answer[index + count - n + pat / 3] == 0) {
index += count - n + pat / 3;
answer[index] = num++;
count++;
}
}
pat++;
}
return answer;
}
}
3. 정리
- 결과 배열의 크기를
n * (n + 1) / 2
로 초기화한다.
num
이 배열 크기와 같아질 때까지 값을 채운다.
- 각 패턴은
pat % 3
을 이용해 계산하고, 해당 패턴에 따라 숫자를 배열에 넣는다.
4. 다른 사람의 코드 리뷰
class Solution {
public int[] solution(int n) {
int[] answer = new int[(n*(n+1))/2];
int[][] matrix = new int[n][n];
int x = -1, y = 0;
int num = 1;
for (int i = 0; i < n; ++i) {
for (int j = i; j < n; ++j) {
if (i % 3 == 0) {
++x;
} else if (i % 3 == 1) {
++y;
} else if (i % 3 == 2) {
--x;
--y;
}
matrix[x][y] = num++;
}
}
int k = 0;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
if(matrix[i][j] == 0) break;
answer[k++] = matrix[i][j];
}
}
return answer;
}
}
- 2차원 배열을 활용하여 이동 패턴을 더 간단하게 구현하였다.
Share article