Leetcode Java 01 Matrix
업데이트:
문제
코드
class Solution {
public int[][] updateMatrix(int[][] mat) {
int row = mat.length;
int col = mat[0].length;
int distance = row + col;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (mat[i][j] == 0) {
continue;
}
int top = distance;
int left = distance;
if (i - 1 >= 0) {
top = mat[i - 1][j];
}
if (j - 1 >= 0) {
left = mat[i][j - 1];
}
mat[i][j] = Math.min(top, left) + 1;
}
}
for (int i = row - 1; i >= 0; i--) {
for (int j = col - 1; j >= 0; j--) {
if (mat[i][j] == 0) {
continue;
}
int bottom = distance;
int right = distance;
if (i + 1 < row) {
bottom = mat[i + 1][j];
}
if (j + 1 < col) {
right = mat[i][j + 1];
}
mat[i][j] = Math.min(mat[i][j], Math.min(bottom, right) + 1);
}
}
return mat;
}
}
결과
설명
-
mat 내 요소들 간 0과의 인접 거리를 구해서 값을 바꾸는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- row는 mat 행의 개수를 저장한 변수이다.
- col은 mat 열의 개수를 저장한 변수이다.
- distance는 첫 셀에서 끝 셀까지 최대 이동 거리가 될 수 있는 거리를 저장할 변수로, $row + col$로 정의한다.
- 0부터 row 미만까지 i를 증가시키고, 0부터 col 미만까지 j를 증가시켜 좌측 위에서 우측 아래로 이동하며 아래를 수행한다.
- mat[i][j]의 값이 0인 경우 자기 자신과 거리가 0이므로, 무시하고 넘어간다.
- top과 left를 최대 이동 거리인 distance로 초기화 시킨다.
- $i - 1$이 0 이상인 경우, top에 mat[$i - 1$][j]를 넣어준다.
- $j - 1$이 0 이상인 경우, left에 mat[i][$j - 1$]를 넣어준다.
- mat[i][j]에 top과 left중 작은 값인 가장 인접한 거리에 1을 더해서 넣어준다.
- $row - 1$부터 0 이상까지 i를 감소시키고, $col - 1$부터 0 이상까지 j를 감소시켜 우측 아래에서 좌측 위로 이동하며 아래를 수행한다.
- mat[i][j]의 값이 0인 경우 자기 자신과 거리가 0이므로, 무시하고 넘어간다.
- bottom과 right를 최대 이동 거리인 distance로 초기화 시킨다.
- $i + 1$이 0 이하인 경우, bottom에 mat[$i + 1$][j]를 넣어준다.
- $j + 1$이 0 이하인 경우, right에 mat[i][$j + 1$]를 넣어준다.
- mat[i][j]에 bottom, right중 작은 값인 가장 인접한 거리에 1을 더한 값과 mat[i][j]의 값 중 작은 값을 넣어준다.
- 두 반복이 완료되면 완성된 mat를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기