Home 백준 - 14719. 빗물
Post
Cancel

백준 - 14719. 빗물

[백준] 14719. 빗물

Link

문제

2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.

비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?

입력

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)

두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.

따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.

출력

2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.

빗물이 전혀 고이지 않을 경우 0을 출력하여라.

예제 입력 1

1
2
4 4
3 0 1 4

예제 출력 1

1
5

예제 입력 2

1
2
4 8
3 1 2 3 4 1 1 2

예제 출력 2

1
5

예제 입력 3

1
2
3 5
0 0 0 2 0

예제 출력 3

1
0

풀이

목표는 고이는 빗물의 총량을 계산하기.

그렇다면 빗물이 언제, 어떻게 고이는 지를 파악하는 것이 포인트!

빗물은 언제 고이는가

  • 특정 위치를 기준으로 좌우 방향에 각각 자신보다 더 높은 블록이 있을 때

빗물이 어떻게 고이는가

  • 좌우 방향에 각각 자신보다 더 높은 블록이 있을 때, 그 두 블록중에 작은 블록의 높이에 맞춰 고인다.

규칙을 파악했으니 문제 풀이를 정리하면

  1. 현 위치에서 좌우에 자신보다 더 높은 블록이 있는지 체크한다.
  2. 두 블록 중 더 작은 블록의 높이 low를 구한다.
  3. 현 위치 블록의 높이를 low에 뺀다.
  4. 그 값을 빗물의 총량을 나타내는 water에 더한다.
  5. 오른쪽으로 위치를 이동한다.

이를 2차원 세계의 맨 왼쪽과 오른쪽을 제외한, 빗물이 고일 수 있는 위치에서 한번씩 반복하면 빗물의 총량을 계산할 수 있다!

(맨 왼쪽과 오른쪽은 빗물이 고일 수 없다고 했으니 제외하는 것을 잊지 말아야 함!)

코드는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
h, w = map(int, input().split())
ground = list(map(int, input().split()))
water = 0

for i in range(1, len(ground)-1):
    left = max(ground[:i])
    right = max(ground[i+1:])
    
    low = min(left, right)
    
    if ground[i] < low:
        water += low - ground[i]
        
print(water)
This post is licensed under CC BY 4.0 by the author.

백준 - 1453. 1로 만들기(MJ)

백준 - 14719. 빗물(MJ)