벽의 모양이 주어지면 담길 수 있는 빗물의 칸 수를 출력하는 문제.
2차원 정보로 주어졌다면 아래에서 부터 행마다 둘러싸인 칸 수만을 더하면 된다.
하지만 문제는 특이하게 벽의 정보가 2차원으로 주어지지 않고 왼쪽부터 벽의 높이로 주어지므로 다른 방법을 찾아야 한다.
즉, 벽은 중간이 빌 수 없고 바닥에 붙어있다.
왼쪽부터 벽을 점검하며 벽이 높아지는 순간 이전 열들에 물을 채워넣는 방식으로 구현했다.
def main() -> None:
H, W = map(int, input().split())
WALL = list(map(int, input().split()))
answer = 0
idx_max = 0
for i in range(1, W):
if WALL[i] > WALL[i-1]:
for j in range(i-1, idx_max, -1):
if WALL[j] >= WALL[i]:
break
answer += min(WALL[idx_max], WALL[i])-WALL[j] # 실수 2를 고친 부분
WALL[j] = min(WALL[idx_max], WALL[i]) # 실수 1을 고친 부분
if WALL[i] >= WALL[idx_max]:
idx_max = i
print(answer)
if __name__ == "__main__":
main()
벽의 개수가 최대 500개이기 때문에 제한시간이 넉넉하다.
그냥 2차원 배열로 풀어봤다.
def main() -> None:
H, W = map(int, input().split())
WALL = list(map(int, input().split()))
answer = 0
arr = []
for wall in WALL:
arr.append([1 for _ in range(wall)] + [0 for _ in range(H-wall)])
for i in range(H):
last = -1
for j in range(W):
if arr[j][i] == 0:
if last != -1:
last += 1
else:
if last != -1:
answer += last
last = 0
print(answer)
if __name__ == "__main__":
main()