ex ) [1,0,2,0,1,1,3] -> 5 (그림참조)
def trap(height):
if not height:
return 0
volume = 0
# 투 포인터의 인덱스를 지정( 첫값과 끝값으로 )
left, right = 0, len(height) - 1
left_max , right_max = height[left] , height[right]
#투 포인터가 만날때까지 각각의 최대값 구하는 반복문
while left < right:
left_max, right_max = max(height[left],left_max), max(height[right], right_max)
#더 높은쪽을 향해 투 포인터 이동
if left_max <= right_max:
volume += left_max - height[left]
left += 1
else:
volume += right_max - height[right]
right -= 1
return volume
def trap(height):
stack = []
volume = 0
for i in range(len(height)):
# 현재 높이가 이전 높이보다 높을 때 수행되는 반복문
while stack and height[i] > height[stack[-1]]:
top = stack.pop()
# len(stack)이 0일 경우 break
if not len(stack):
break
# 거리 및 높이 구하기
distance = i - stack[-1] -1
waters = min(height[i], height[stack[-1]]) - height[top]
volume += distance * waters
stack.append(i)
return volume