Programming/Algorithm
[백준] 14719번 빗물 (by Python)
oranz.23
2021. 3. 26. 01:32
문제
https://www.acmicpc.net/problem/14719
풀이
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일 경우 종료시키도록 구현하였다.