57 lines
2.1 KiB
Python
57 lines
2.1 KiB
Python
# 빗물
|
|
|
|
import sys
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def solution():
|
|
h, w = map(int, input().rstrip().split())
|
|
|
|
blocks = map(int, input().rstrip().split())
|
|
|
|
stack = []
|
|
result = 0
|
|
for b in blocks:
|
|
if stack:
|
|
if b < stack[0]:
|
|
stack.append(b)
|
|
continue
|
|
else:
|
|
while stack:
|
|
if len(stack) == 1:
|
|
stack.pop()
|
|
break
|
|
result += stack[0] - stack.pop()
|
|
stack.append(b)
|
|
else:
|
|
stack.append(b)
|
|
|
|
while stack:
|
|
if len(stack) == 1:
|
|
stack.pop()
|
|
break
|
|
now = stack.pop()
|
|
while stack and stack[-1] <= now:
|
|
result += now - stack.pop()
|
|
|
|
print(result)
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 50분
|
|
|
|
시간 복잡도: 모든 블럭이 stack에 한번씩 들어갔다가 나오기 때문에 O(n)이다.
|
|
|
|
해설: 이전에 풀었던 지붕 쌓기와 비슷한 문제이다. 이런 문제들에서 시간을 뺐기지 않고 가려면 좀 공식화해둘 필요가 있다.
|
|
내가 기억해야하고 기억하지 않아도 될 것들을 구분해야 하는데,
|
|
(1) 시작 블럭의 높이를 기준으로 동등하거나 그 이상의 블럭이 나오면 지금까지 나왔던 것들은 시작 블럭 기준으로 계산하고, 잊어도 됨
|
|
1번을 진행하면서 stack의 내용물은 pop되고 새로운 시작 기준점이 잡힌다.
|
|
(2) 시작 블럭의 높이를 기준으로 미만인 것들만 있다면 pop될 일이 없기 때문에 다 끝나면 stack에 내용물이 있을 것이다.
|
|
이제 stack을 다 비우면서 모든 블럭에 대한 계산을 진행해야 한다.
|
|
이때부터는 1번의 역순이다. 왜 why? 시작 블럭 기준으로 미만인 것들만 있었다는 것은 오르내리막이 있어도 최종적으로는 내리막이었다는 뜻이고,
|
|
이는 거꾸로 보면 1번에서 하던것처럼 동등하거나 그 이상의 블럭이 무조건 있다는 뜻이다.
|
|
따라서 기준점을 stack[-1]로 잡고 1번 방식을 진행하면 된다.
|
|
""" |