문제

https://www.acmicpc.net/problem/14719


풀이


풀이1

  • 31256 KB, 144 ms
import sys
input = sys.stdin.readline

H, W = map(int, input().rstrip().split()) # 세로 H, 가로 W
blocks = list(map(int, input().rstrip().split()))

water = 0

for i in range(1, W - 1) :
    flag = True

    while flag :
        if blocks[i - 1] > blocks[i] and i + 1 < W :
            for j in range(i + 1, W) :
                if blocks[i] < blocks[j] :
                    water += 1
                    blocks[i] += 1
                    break
                elif j == W - 1 : flag = False
        else : flag = False

print(water)


풀이1 설명

처음 문제를 보고 스택으로 풀면 되겠다는 생각이 들었으나 막상 코드를 짜려고 하니 복잡해져서 스택 풀이는 포기 ..

각 블럭에 빗물이 고일 수 있는지 한 칸 씩 확인했다.

빗물이 고일 수 있는 조건은

1. 왼쪽에 블럭 벽이나 빗물이 고여있어야 하고

2. 오른쪽 어딘가에 현재 위치보다 높은 블럭이 있어야 한다

한 칸 씩 만 확인해서 효율적인 코드는 아니었지만

input 범위를 보니 시간초과 날 것 같지는 않아서 이 코드로 제출하고 통과


풀이2

  • 31256 KB, 44 ms
import sys
input = sys.stdin.readline

H, W = map(int, input().rstrip().split()) # 세로 H, 가로 W
blocks = list(map(int, input().rstrip().split()))

rain = 0

for i in range(1, W - 1) :
    left = max(blocks[:i])
    right = max(blocks[i:])

    tmp = min(left, right)

    if tmp > blocks[i] : rain += tmp - blocks[i]

print(rain)


풀이2 설명

블럭에 빗물이 얼마나 고일 수 있는지 한 칸 씩 넣어보는 것이 아니라 한 번에 고일 수 있는 용량을 구하는 방법 !

i 번째 이전 블럭의 최대 높이와 i 번째 이후 블럭의 최대 높이 중 낮은 블럭의 높이 까지 빗물이 고이게 된다.

빗물이 고이는 높이와 i번째 블럭의 높이의 차가 i번째 블럭에 고이는 빗물의 양이 된다. (단, i번째 블럭의 높이가 더 낮아야 함)


배운 점

단순하게 생각하자


Leave a comment