문제 : https://www.acmicpc.net/problem/14719
문제
2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.
![](https://blog.kakaocdn.net/dn/caA0HG/btsLV1xTQGs/QQqMsrelFp11K3e3Bqnso0/img.png)
![](https://blog.kakaocdn.net/dn/bnkkrq/btsLUFphqmC/9VKknObma0eeXeQfzhya4K/img.png)
비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?
입력
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.
출력
2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.
빗물이 전혀 고이지 않을 경우 0을 출력하여라.
예제 입력 1
4 4
3 0 1 4
예제 출력 1
5
예제 입력 2
4 8
3 1 2 3 4 1 1 2
예제 출력 2
5
나의 풀이
h, w = map(int, input().split())
block = list(map(int, input().split()))
answer = 0
for i in range(1, w-1):
left = max(block[:i])
right = max(block[i+1:])
m = min(left, right)
if m > block[i]:
answer += m - block[i]
print(answer)
처음엔 이중 for문 돌려가며 블럭이 있는 위치를 저장하고, 왼쪽부터 높이를 체크하며 풀었지만 시간 초과였다.
문제는 간단하게 1번줄부터 w-1줄 범위까지(양 끝은 물이 채워질 수 없으므로) 검사하고자 하는 세로줄을 기준으로 왼쪽, 오른쪽을 나누어 각각 최댓값을 구하고 그들의 최솟값 m을 구한다. 현재 세로줄 블럭은 m-현재 세로줄의 블럭 높이 만큼 물이 채워지므로 w-1줄까지 채워지는 물의 수를 더하면 답을 구할 수 있다.
'코딩테스트 > 백준 (python)' 카테고리의 다른 글
백준 / 1072번 / 게임 / python 파이썬 (0) | 2025.02.04 |
---|---|
백준 / 1890번 / 점프 / python 파이썬 (0) | 2025.01.27 |
백준 / 2468번 / 안전 영역 / python 파이썬 (0) | 2025.01.17 |
백준 / 5430번 / AC / python 파이썬 (0) | 2025.01.13 |
백준 / 18352번 / 특정 거리의 도시 찾기 (BFS) / python 파이썬 (0) | 2025.01.10 |