상상쓰

[백준] 빗물 본문

Coding Test

[백준] 빗물

상상쓰 2021. 10. 28. 17:49

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

 

14719번: 빗물

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치

www.acmicpc.net

 

쉽게 생각했을 때, 해당 열에 고인 빗물의 양은 해당 열을 기준으로 왼쪽에서 가장 높은 블록과 오른쪽에서 가장 높은 블록 중 가장 작은 길이 - 해당 열의 블록의 길이이다. (단, >= 0)

 

leftMaxRainwater[i] = 0 ~ i열로 이동할 때 가장 긴 블록의 길이

rightMaxRainwater[i] = W-1 ~ i열로 이동할 때 가장 긴 블록의 길이

를 구한 뒤 min(leftMaxRainwater[i-1], rightMaxRainwater[i+1]) - rainwater[i] (1< i < W-1) 가 양수라면 answer 에 더하여 반환한다.

 

import sys

H, W = map(int, sys.stdin.readline().split())
rainwater = list(map(int, sys.stdin.readline().split()))
answer = 0
leftMaxRainwater = [0] * W
rightMaxRainwater = [0] * W

for i in range(W):
    leftMaxRainwater[i] = max(leftMaxRainwater[i-1], rainwater[i]) if i - 1 >= 0 else rainwater[0]
    rightMaxRainwater[W-1-i] = max(rightMaxRainwater[W-i], rainwater[W-1-i]) if W-i < W else rainwater[-1] 

for i in range(1, W-1):
    value = min(leftMaxRainwater[i-1], rightMaxRainwater[i+1]) - rainwater[i]
    answer += value if value > 0 else 0
    
print(answer)

'Coding Test' 카테고리의 다른 글

[백준] 지능형 기차 2  (0) 2021.10.29
[백준] 약수 구하기  (0) 2021.10.29
[백준] 괄호의 값  (0) 2021.10.27
[백준] 연산자 끼워넣기  (0) 2021.10.26
[프로그래머스] 12주차_피로도  (0) 2021.10.25
Comments