Given an m x n integer matrix heightMap representing the height of each unit cell in a 2D elevation map,
return the volume of water it can trap after raining.
[[1,4,3,1,3,2],
[3,2,1,3,2,4],
[2,3,3,2,3,1]] # 위 사진과 동일
[12, 12, 12, 12]
[12, 4, 8, 12]
[12, 12, 12, 12]
가 있을때
2행 4열의 12를 탐색해서 8을 찾아 4칸만큼 물을 채웠다고 했을때
힙에 8을 넣으면 4 부분에선 8칸의 빗물이 들어갈수 있으나 ( 실제로는 )
계산상 4가 될수 있다.
그렇기에 8을 탐색할때 힙에는 그것을 탐색한 최소 높이인 12를 넣어야 한다.
class Solution:
def trapRainWater(self, heightMap: List[List[int]]) -> int:
h = []
visited = set()
grid = heightMap
R = len(grid)
C = len(grid[0])
# 가장자리 부분 Heap에 넣기
for r in range(R):
for c in range(C):
if r == 0 or c == 0 or r == R - 1 or c == C - 1:
heappush(h, (grid[r][c], r, c))
visited.add((r, c))
directions = [[0, -1], [0, 1], [-1, 0], [1, 0]]
ans = 0
while h:
height, row, col = heappop(h)
# 상하좌우 탐색
for i in range(4):
row_dir, col_dir = directions[i]
to_row = row + row_dir
to_col = col + col_dir
if min(to_row, to_col) < 0 or to_row >= R or to_col >= C:
continue
# 이전에 방문하지 않은 경우에만
if (to_row, to_col) not in visited:
# 여기 방문함!
visited.add((to_row, to_col))
# 만약 높이가 낮다면
if grid[to_row][to_col] < height:
# 그만큼 정답에 더하고 ( 빗물이 찬 양이니까 )
ans += height - grid[to_row][to_col]
# 힙에는 탐색에 사용된 높이를 넣는다.
heappush(h, (height, to_row, to_col))
else:
# 더 크다면 그냥 새로운 가장자리가 될수 있도록 해준다.
# 그냥 힙에 다시 넣는다는 뜻
heappush(h, (grid[to_row][to_col], to_row, to_col))
return ans