From 3777344b56706cdb4a97c2daac024b42ecd837f8 Mon Sep 17 00:00:00 2001 From: nkey Date: Mon, 23 Feb 2026 16:33:43 +0900 Subject: [PATCH] =?UTF-8?q?14719-g5=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workbook_8708/gold/14719-g5.py | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 workbook_8708/gold/14719-g5.py diff --git a/workbook_8708/gold/14719-g5.py b/workbook_8708/gold/14719-g5.py new file mode 100644 index 0000000..3c33d4e --- /dev/null +++ b/workbook_8708/gold/14719-g5.py @@ -0,0 +1,57 @@ +# 빗물 + +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번 방식을 진행하면 된다. +""" \ No newline at end of file