Programming/Algorithm

[백준] 14719번 빗물 (by Python)

oranz.23 2021. 3. 26. 01:32

문제

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

 

14719번: 빗물

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치

www.acmicpc.net

 

풀이

h, w = map(int, input().split())
block = [[False] * w for _ in range(h)]
height = list(map(int, input().split()))
for i, ht in enumerate(height):
    for j in range(ht):
        block[j][i] = True

i, count = 0, 0
ans = 0
start, end = False, False
while not (start and end):
    temp = 0
    count = 0
    for j in range(1, w):
        if temp == 0 and block[i][j - 1] and not block[i][j]:
            temp = 1
        elif temp != 0 and not block[i][j]:
            temp += 1
        elif temp > 0 and block[i][j]:
            count += temp
            temp = 0
    if not start and count > 0:
        start  = True
    if start and count == 0:
        end = True
    ans += count
    i += 1
    if i == h:
        break
print(ans)

    구현 문제이다. 주어진 h, w로 2차원 리스트를 만들고 블록이 채워져있는 부분을 True, 아닌 부분을 False로 주어 2차원 세계를 구현하였다. 아래 row부터 따져나가길 시작하며, 각 row에서 양쪽에 block이 있는 공간만을 세어 count에 더한다. 이 때, count가 0이 되는 것을 기준으로 loop을 종료시키는데 아래 row에서 모든 block이 꽉 차있어 count가 0인 경우도 있으므로, 처음 0보다 큰 count가 발생했을 때 시작했다는 것을 표시한다. 그리고 시작이 된 후에 count가 0일 경우 종료시키도록 구현하였다.