[BOJ] 14719 빗물 바로가기
2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.
비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.
2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.
빗물이 전혀 고이지 않을 경우 0을 출력하여라.
✍ 문제 풀이
leftWall
)과 오른쪽에 존재하는 블록 중 가장 큰 블록의 값(rightWall
)을 구한다.leftWall
과 rightWall
은 현재 위치의 블록에 빗물이 고일 수 있도록 만드는 벽과 같다고 볼 수 있다.leftWall
과 rightWall
의 값이 현재 블록의 높이보다 작거나 같다면 현재 블록에는 빗물이 고일 수 없다.leftWall
과 rightWall
의 값이 현재 블록의 높이보다 높다면 현재 블록에는 빗물이 고일 수 있다.leftWall
과 rightWall
중 더 작은 블록의 높이 값에서 현재 블록의 높이 값만큼을 뺀 값이다.result
에 순차적으로 합하여 결과를 출력한다.✍ 코드
from sys import stdin
def SumOfRainWater(W,blocks):
result = 0
for i in range(1,W-1):
# leftWall : 현재 위치 기준 왼쪽에 존재하는 블록 중 가장 큰 블록
# rightWall : 현재 위치 기준 오른쪽에 존재하는 블록 중 가장 큰 블록
# std : 현재 위치에 쌓일 빗물의 양의 계산을 위한 기준
leftWall, rightWall = max(blocks[:i]), max(blocks[i+1:])
std = min(leftWall,rightWall)
# std가 현재 위치의 블럭보다 높다면,
if std > blocks[i]: result += std - blocks[i]
return result
H, W = map(int,stdin.readline().split())
blocks = tuple(map(int,stdin.readline().split()))
print(SumOfRainWater(W,blocks))