Leetcode Java Dungeon Game
업데이트:
문제
코드
class Solution {
public int calculateMinimumHP(int[][] dungeon) {
int row = dungeon.length;
int col = dungeon[0].length;
int[][] health = new int[row][col];
for (int i = row - 1; i >= 0; i--) {
for (int j = col - 1; j >= 0; j--) {
if (i == row - 1 && j == col - 1) {
health[i][j] = Math.max(1, 1 - dungeon[i][j]);
} else if (i == row - 1) {
health[i][j] = Math.max(health[i][j + 1] - dungeon[i][j], 1);
} else if (j == col - 1) {
health[i][j] = Math.max(health[i + 1][j] - dungeon[i][j], 1);
} else {
health[i][j] = Math.min(Math.max(health[i + 1][j] - dungeon[i][j], 1), Math.max(health[i][j + 1] - dungeon[i][j], 1));
}
}
}
return health[0][0];
}
}
결과
설명
- 주어진 2차원 배열인 dungeon을 이용하여 dungeon[0][0]에서 dungeon[$dungeon.length - 1$][$dungeon[0].length - 1$]에 도달하기까지 숫자들의 합이 양의 정수가 되는 최소한의 health를 찾는 문제이다.
- 단, 이동은 오른쪽과 아래로만 가능하다.
- 문제 풀이에 필요한 변수를 정의한다.
- row는 주어진 2차원 배열 dungeon 행의 개수를 저장한 변수이다.
- col은 주어진 2차원 배열 dungeon 열의 개수를 저장한 변수이다.
- health는 주어진 2차원 배열 dungeon을 탐색할 때 필요한 health를 산정하기 위해 사용될 2차원 배열로, dungeon과 동일한 크기로 선언한다.
- dungeon[$row - 1$][$col - 1$]부터 시작해서 역순으로 탐색에 필요한 최소한의 health를 구한다.
- 시작 위치인 dungeon[$row - 1$][$col - 1$]인 경우, 1과 $1 - dungeon[i][j]$ 중 큰 값을 넣어준다.
- i가 마지막 행인 $row - 1$인 경우, 우측 값에서 현재 값을 뺀 값과 1 중 큰 값을 넣어준다.
- j가 마지막 열인 $col - 1$인 경우, 아래 값에서 현재 값을 뺀 값과 1 중 큰 값을 넣어준다.
- 그 외의 경우, 우측 값에서 현재 값을 뺀 값과 1중 큰 값과 아래 값에서 현재 값을 뺀 값과 1 중 큰 값 중 작은 값을 넣어준다.
- 반복이 완료되면 health[0][0]의 값을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기