2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.
비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.
2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.
빗물이 전혀 고이지 않을 경우 0을 출력하여라.
4 4
3 0 1 4
5
4 8
3 1 2 3 4 1 1 2
5
3 5
0 0 0 2 0
0
a,b=map(int,input().split())
l=list(map(int,input().split()))
left , right=0,b-1
leftMax=l[left]
rightMax=l[right]
answer=0
while left < right:
leftMax=max(leftMax,l[left])
rightMax=max(rightMax,l[right])
if leftMax >= rightMax:
answer += rightMax-l[right]
right-=1
if leftMax<rightMax:
answer +=leftMax-l[left]
left+=1
print(answer)
방식은 투포인터 방식을 사용했다.
즉 왼쪽에서하나 오른쪽에서 하나 출발해서 하나씩 옮겨가며 빗물을 고일만한 곳을 탐색하는 방법이다.
먼저 왼쪽과 오른쪽을 비교해서 크기가 작은 값 부터 먼저 이동시켜서 빗물을 탐색한다.
그후 빗물을 탐색하고나서도 오른쪽과 왼쪽이 만나지 않았다면 다시 나머지 큰 쪽이 움직여서 고일만한 곳을 탐색하는 식이다.
h, w = map(int, input().split())
world = list(map(int, input().split()))
ans = 0
for i in range(1, w - 1):
left_max = max(world[:i])
right_max = max(world[i+1:])
compare = min(left_max, right_max)
if world[i] < compare:
ans += compare - world[i]
print(ans)
https://seongonion.tistory.com/115
이런 방식의 코드도 있었다.
즉 현재 위치에서 자기가 벽에 둘러싸여있는지 즉 고일만한 위치에있는지 파악후 만약 맞다면 둘중 낮은 벽을 기준으로 고인물을 계산해서 결과값을 도출하는 형식이다.