728x90

☔️
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())
arr = [[0] * W for _ in range(H)]
height = list(map(int, input().split()))
ans = 0
for i in range(W):
for j in range(H-height[i], H):
arr[j][i] = 1
for i in range(H):
block = []
for j in range(W):
if arr[i][j] == 1:
block.append(j)
if len(block) > 1:
s = block.pop(0)
e = block.pop(0)
ans += e - s - 1
while block:
s = e
e = block.pop(0)
ans += e - s - 1
print(ans)
코드 설명
높이를 입력받아 각 열에 해당 높이만큼 블록을 쌓는다.
값이 1인 것을 블록으로 간주한다.
for i in range(W):
for j in range(H-height[i], H):
arr[j][i] = 1
이제 한 행씩 검사한다.
block: 현재 행에서 블록의 인덱스를 저장하는 리스트
빗물이 고이려면 블록이 무조건 2개 이상이어야 한다.
첫 번째 블록의 위치를 s(시작 블록)에 저장하고, 두 번째 블록의 위치를 e(끝 블록)에 저장한 후,
두 블록 사이에 고인 빗물량을 ans에 더한다.
모든 블록을 검사할 때까지 이 과정을 반복한다.
다음 블록으로 넘어갈 때, 끝 블록이 시작 블록(s = e)이 된다.
for i in range(H):
block = []
for j in range(W):
if arr[i][j] == 1:
block.append(j)
if len(block) > 1:
s = block.pop(0)
e = block.pop(0)
ans += e - s - 1
while block:
s = e
e = block.pop(0)
ans += e - s - 1
'코딩테스트' 카테고리의 다른 글
[백준][Python] 10828 스택 (0) | 2024.03.27 |
---|---|
[백준][Python] 2828 사과 담기 게임 (1) | 2024.03.26 |
[백준][Python] 9935 문자열 폭발 (1) | 2024.03.24 |
[백준][Python] 3085 사탕 게임 (0) | 2024.03.24 |
[백준][Python] 2002 추월 (1) | 2024.03.23 |