14719_빗물

hey hey·2021년 12월 25일
0

알고리즘

목록 보기
12/57
post-thumbnail

문제

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

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

입력

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

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

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

출력

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

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

풀이

오랜만의 구현문제라 신난다. 예) 3 1 2 3 4 1 1 2

풀이방법 > 왼쪽부터 큰값을 하나 잡아 오른쪽을 봤을 때 같거나 높은 곳이 있다면 그 사이의 값은 처음의 큰값으로 채워지게 된다.

오른쪽부터도 똑같이 진행한다.

빗물이 받아졌을 때의 결과는 3 3 3 3 4 2 2 2 이다 결과값은 이 값을 뺀 차이 합이다.

import sys
sys.stdin = open('input.txt')

H,W = map(int,input().split())
original_graph = list(map(int,input().split()))
graph = original_graph[::]
# 5 2 4 1 3 5 3 4


i = 0
big = i # 왼쪽부터 시작하는데 큰값을 자기로 잡고
while i<W: # 오른쪽에 위치한 값중 나보다 큰 곳 & 같은 곳이 있다면
    if graph[i]>= graph[big]:
        for j in range(big,i):  # 그 사이의 값을 모두 큰 값으로 바꿔준다
            graph[j] = graph[big]
        big = i                 # 이제 큰 값을 그 뒤부터가 된다.
    i += 1


k = W-1     # 뒤에서부터 시작하겠다
big2 = k
while k>=big:
    if graph[k]>= graph[big2]:  # 똑같이 왼쪽의 값이 큰 값보다 크거나 같다면
        for j in range(big2,k,-1):      # 바꿔준다.
            graph[j] = graph[big2]
        big2 = k
    k -= 1

result =0
for i in range(W):      # 바꿔준 값들의 차이가 빗물양
    result += graph[i]-original_graph[i]
print(result)
profile
FE - devp

0개의 댓글