반응형
문제
https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
🐍파이썬
import sys
input=sys.stdin.readline
answer = 0
h, w = map(int, input().split()) #2차원 세로 h, 2차원 가로 w
arr = list(map(int, input().split())) #블록이 쌓인 높이
for i in range(1, len(arr)-1):
left_max = max(arr[:i+1])
right_max = max(arr[i+1:])
total_min = min(left_max, right_max)
if total_min > arr[i]:
answer += total_min - arr[i]
print(answer)
💡 풀이과정
- 빗물이 고이려면 블럭 i의 양쪽 블럭의 높이가 i보다 높아야 한다.
- for루프를 돌면서 각 블럭의 이전 블럭들 중 가장 높은 블럭, 다음 블럭들 중 가장 높은 블럭을 구한다.
- 이때 빗물은 두 블럭 중 더 작은 높이의 블럭만큼 고일 수 있기 때문에, min(left_max, right_max)에서 현재 블럭의 높이를 빼주어 이번 블럭에서 고일 빗물의 높이를 구해준다.
- 첫 번째와 마지막 블럭에는 빗물이 고일 수 없기 때문에 for 루프를 돌 리스트의 범위는 range(1, len(arr)-1) 이다.
다른 풀이 방법
_, _ = map(int, input().split()) #h, w가 쓰일 일이 없으므로 변수 할당x
walls = list(map(int, input().split()))
stack = []
answer = 0
for i, h in enumerate(walls):
while stack and walls[stack[-1]] < h:
b = walls[stack.pop()]
if not stack:
break
d = i - stack[-1] - 1
wh = min(walls[stack[-1]], h) - b
answer += d * wh
stack.append(i)
print(answer)
👇 풀이방법 참고 블로그
https://kimmeh1.tistory.com/261?category=926574
[백준 14719] 빗물
문제 2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다. 비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까? 입력 첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계
kimmeh1.tistory.com
반응형
'Problem Solving > 백준' 카테고리의 다른 글
[백준|파이썬] 1138: 한 줄로 서기 (실버2) (0) | 2023.06.24 |
---|---|
[백준|파이썬] 16506: CPU (실버5) (0) | 2023.05.06 |
[백준|파이썬] 3568: iSharp (실버5) (0) | 2023.05.05 |
[백준|파이썬] 7568: 덩치 (실버5) (2) | 2023.04.30 |
[백준|파이썬] 4673: 셀프 넘버 (실버5) (0) | 2023.04.29 |
[백준|파이썬] 9655: 돌 게임 (실버5) (0) | 2023.04.28 |