Leetcode Java Trapping Rain Water II
업데이트:
문제
코드
class Solution {
public int trapRainWater(int[][] heightMap) {
int row = heightMap.length;
int col = heightMap[0].length;
int[][] volume = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
volume[i][j] = heightMap[i][j];
}
}
boolean update = true;
boolean init = true;
while (update) {
update = false;
for (int i = 1; i < row - 1; i++) {
for (int j = 1; j < col - 1; j++) {
int val = Math.max(heightMap[i][j], Math.min(volume[i - 1][j], volume[i][j - 1]));
if (init || val < volume[i][j]) {
volume[i][j] = val;
update = true;
}
}
}
init = false;
for (int i = row - 2; i >= 1; i--) {
for (int j = col - 2; j >= 1; j--) {
int val = Math.max(heightMap[i][j], Math.min(volume[i + 1][j], volume[i][j + 1]));
if (val < volume[i][j]) {
volume[i][j] = val;
update = true;
}
}
}
}
int sum = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (volume[i][j] - heightMap[i][j] > 0) {
sum += (volume[i][j] - heightMap[i][j]);
}
}
}
return sum;
}
}
결과
설명
-
주어진 2차원 정수 배열 heightMap을 이용하여 빗물을 가둘 수 있는 물의 양을 반환하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- row는 heightMap의 행의 개수를 저장하는 변수로, heightMap.length로 초기화한다.
- col은 heightMap의 열의 개수를 저장하는 변수로, heightMap[0].length로 초기화한다.
- volume은 주어진 heightMap의 빗물을 가둔 후 최대 높이를 저장할 배열로, heightMap의 값으로 초기화한다.
- update는 값의 수정 유무를 저장할 변수로, true로 초기화한다.
- init은 첫 수행 여부를 저장할 변수로, true로 초기화한다.
- update가 true일 때 까지 반복하여 아래를 수행한다.
- update를 false로 수정하여 수정 내역이 없는 상태로 초기화한다.
- heightMap을 행과 열을 1부터 row와 col의 값보다 1 작게 반복하여 아래를 수행한다.
- val에 volume[i - 1][j]의 값과 volume[i][j - 1]의 값 중 작은 값하고 heightMap[i][j]의 값 중 큰 값을 넣어준다.
- 첫 수행이거나 val이 volume[i][j]보다 작아 물을 담을 높이보다 큰 경우, volume[i][j]에 val 값을 넣어 평준화 시키고 update를 true로 바꾸어 수정한 상태로 바꾸어준다.
- 첫 수행이 완료되었으므로, init을 false로 바꾸어준다.
- heightMap을 행과 열을 row와 col의 값보다 2 작은 값에서 1까지 반복하여 아래를 수행한다.
- val에 volume[i + 1][j]의 값과 volume[i][j + 1]의 값 중 작은 값하고 heightMap[i][j]의 값 중 큰 값을 넣어준다.
- val이 volume[i][j]의 값보다 작아 물을 담을 높이보다 큰 경우, volume[i][j]에 val 값을 넣어 평준화 시키고 update를 true로 바꾸어 수정한 상태로 바꾸어준다.
-
반복이 완료되면 빗물을 가둘 수 있는 물의 양을 저장할 sum을 0으로 초기화시킨다.
-
volume을 반복하여 heightMap과 각 위치의 차이 값이 volume이 더 큰 경우, sum에 volume의 값과 heightMap의 값의 차이를 더해준다.
- 위의 반복이 완료되면 빗물을 가둘 수 있는 물의 양을 저장한 sum을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기