Leetcode Java Path With Minimum Effort
업데이트:
문제
코드
class Solution {
public int minimumEffortPath(int[][] heights) {
int row = heights.length;
int col = heights[0].length;
Queue<int[]> queue = new PriorityQueue<>((a, b) -> a[2] - b[2]);
int[][] dist = new int[row][col];
int[][] directions = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } };
for (int[] r : dist) {
Arrays.fill(r, Integer.MAX_VALUE);
}
dist[0][0] = 0;
queue.add(new int[] { 0, 0, 0 });
while (!queue.isEmpty()) {
int[] curr = queue.poll();
int x = curr[0];
int y = curr[1];
int diff = curr[2];
if (x == row - 1 && y == col - 1) {
return diff;
}
for (int[] direction : directions) {
int nx = x + direction[0];
int ny = y + direction[1];
if (nx >= 0 && nx < row && ny >= 0 && ny < col) {
int next = Math.max(diff, Math.abs(heights[nx][ny] - heights[x][y]));
if (next < dist[nx][ny]) {
dist[nx][ny] = next;
queue.add(new int[] { nx, ny, next });
}
}
}
}
return 0;
}
}
결과
설명
- heights의 좌측 상단부터 우측 하단까지 이동하기 위한 최소한의 노력을 구하는 문제이다.
- 최소한의 노력은 이동하는 셀의 절대적 값의 차이이다.
- 문제 풀이에 필요한 변수를 정의한다.
- row와 col은 height의 행과 열의 길이를 저장한 변수이다.
- queue는 높이 차이를 오름차순으로 저장하여 관리할 변수로, PriorityQueue로 각 값의 세 번째 값의 차이의 오름차순으로 정렬되도록 초기화하고 첫 값을 [0, 0, 0]으로 넣어준다.
- dist는 이동에 대한 절대적 값의 차이를 저장할 변수로, $row \times col$ 크기의 배열로 초기화하고 모든 값을 Integer의 최댓 값으로 넣어준다.
- directions는 이동 방향을 저장할 변수로, 좌우상하 순의 [x, y] 좌표를 넣어준다.
- queue가 비어있지 않을 때까지 아래를 반복한다.
- curr에 queue의 앞에 있는 값을 꺼내 넣어준 후 x, y, diff에 순차적으로 값을 넣어준다.
- 현재 위치가 우측 하단의 마지막 위치인 경우, diff을 주어진 문제의 결과로 반환한다.
- directions를 direction에 순차적으로 넣고 아래를 반복한다.
- nx에 x와 direction[0]을 더해서, ny에 y와 direction[1]을 더해서 넣어준다.
- nx가 [0, row] 범위에 존재하면서 ny가 [0, col] 범위에 존재하는 경우, 아래를 계속 수행하고 아니면 다음 반복을 수행한다.
- next에 diff와 heights[nx][ny]의 값과 heights[x][y]의 차잇값 중 큰 값을 넣어준다.
- next가 dist[nx][ny]의 값보다 작은 경우, dist[nx][ny]에 next를 넣어주고 queue에 [nx, ny, next]를 넣어준다.
- 반복이 완료되면 최소한의 노력으로 이동할 수 없으므로, 0을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기