문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
4개의 정수 row, cols, rCenter, cCenter가 주어진다. rows x cols 행렬이 있고, 현재 좌표가 (rCenter, cCenter)인 셀이 있다.
행렬의 모든 셀의 좌표를 (rCenter, cCenter)와의 거리에 따라 가장 작은 값부터 가장 큰 값 순으로 정렬해서 반환해라. 이 조건을 만족하는한 어떤 순서로든 결과를 반환할 수 있다.
두 셀 (r1, c2)과 (r2, c2) 사이의 거리는 |r1 - r2| + |c1 - c2|이다.
#1
Input: rows = 1, cols = 2, rCenter = 0, cCenter = 0
Output: [[0, 0], [0, 1]]
#2
Input: rows = 2, cols = 2, rCenter = 0, cCenter = 1
Output: [[0, 1], [0, 0], [1, 1], [1, 0]]
#3
Input: rows = 2, cols = 3, rCenter = 1, cCenter = 2
Output: [[1, 2], [0, 2], [1, 1], [0, 1], [1, 0], [0, 0]]
class Solution {
public int[][] allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
int[][] result = new int[rows * cols][];
result[0] = new int[] {rCenter, cCenter};
int idx = 1;
int lim = Math.max(rCenter, rows - rCenter - 1) + Math.max(cCenter, cols - cCenter - 1);
for(int i = 1; i <= lim; i++){
int r = rCenter - i;
int c = cCenter;
for(int j = i; j > 0; j--){
if(r >= 0 && c >= 0){
result[idx++] = new int[] {r, c};
}
r++;
c--;
}
for(int j = i; j > 0; j--){
if(r < rows && c >= 0){
result[idx++] = new int[] {r, c};
}
r++;
c++;
}
for(int j = i; j > 0; j--){
if(r < rows && c < cols){
result[idx++] = new int[] {r, c};
}
r--;
c++;
}
for(int j = i; j > 0; j--){
if(r >= 0 && c < cols){
result[idx++] = new int[] {r, c};
}
r--;
c--;
}
}
return result;
}
}