백준 14719 빗물

고장난 고양이·2022년 7월 16일
0

알고리즘_python

목록 보기
51/84

문제

2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.


비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?

입력

첫 번째 줄에는 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

예제 입력 3

3 5
0 0 0 2 0

예제 출력 3

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

이런 방식의 코드도 있었다.

즉 현재 위치에서 자기가 벽에 둘러싸여있는지 즉 고일만한 위치에있는지 파악후 만약 맞다면 둘중 낮은 벽을 기준으로 고인물을 계산해서 결과값을 도출하는 형식이다.

profile
개발새발X발일지

0개의 댓글