코딩테스트

[백준][Python] 14719 빗물

yeeejji 2024. 3. 25. 15:00
728x90

구현, 시뮬레이션 / 골드 5

☔️

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