Algorithm/Simulation

[Python] 백준 14719번 빗물

코딩쪼앙 2024. 10. 4. 17:48

문제

https://www.acmicpc.net/problem/14719

입력

  • 첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
  • 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
  • 따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.

출력

  • 2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.
  • 빗물이 전혀 고이지 않을 경우 0을 출력하여라.

문제 풀이

  • 물이 고이는 조건
    • 양 옆에 자신보다 높은 크기의 블럭이 존재해야한다.
    • 물이 고이는 경우 더 작은 크기의 블럭의 크기만큼 빗물이 고인다.
  • 더 작은 블럭의 크기 - 현재 블럭의 크기를 수행해야 총 빗물이 고이는 크기를 알아낼 수 있다.
  • 위 조건을 수행하며 쌓인 크기를 모두 더해주면 정답

코드

h, w = map(int,input().split())
blocks = list(map(int,input().split()))

result = 0
for i in range(1, w - 1):
    left = max(blocks[:i])
    right = max(blocks[i + 1:])
    now = blocks[i]
    if left > now and right > now:
        result += min(left, right) - now

print(result)