공부하기/백준

[Python] 백준 풀기 14719 - 빗물

XEV 2022. 12. 22. 23:17

파이썬 백준 14719번

골드 5

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

 

14719번: 빗물

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

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 구현, 시뮬레이션

 

 

 

 

 

문제 풀기

맨 아래 블록을 한 줄씩 제거해가며 그 라인에 물이 담긴 사각형의 개수를 누적하여 더한다.

 

 

블록이 저장된 리스트를 왼쪽에서 오른쪽으로 관찰을 진행하며

 

블록이 있는 곳에서 없는 곳으로 바뀌는 조건

            if block_ls[i] != block_ls[i - 1] and block_ls[i] == 0:

 

을 찾아 물이 담길 가능성의 시작임을 알리고 임시 count_temp 로 저장해 나간다.

 

그리고, 빈 공간에서 블록으로 바뀌는 조건

            elif block_ls[i] != block_ls[i - 1] and block_ls[i] != 0:

 

을 통해 물이 담겼음을 확실시하여 임시 저장된 물을 count += count_temp 누적시킨다.

 

맨 아래 블록들에서 이 과정이 끝나면 그 라인을 제거하기 위해

        for j in range(len(block_ls)):
            if block_ls[j] != 0:
                block_ls[j] = block_ls[j] - 1

코드를 사용한다.

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline


def fnContainedRain(h, w):          ## 2차원으로 쌓인 블록을 아래에서 부터 한줄씩 제거해가며 담긴 빗물을 찾음.
    h_max = max(block_ls)
    
    count = 0           ## 빗물 담긴 사각형의 개수.
    for _ in range(h_max):
        wall = 1            ## 첫 경계가 생기는 순간을 위해 1로 초기화.
        count_temp = 0          ## 가로 한줄에 담긴 빗물 사각형의 개수.
        for i in range(1, w):           ## 맨 아래 가로 한줄을 탐색.
            if block_ls[i] != block_ls[i - 1] and block_ls[i] == 0:         ## 블록에서 빈 경계로 넘어가는 순간.
                wall = 0
            elif block_ls[i] != block_ls[i - 1] and block_ls[i] != 0:           ## 빈 곳에서 블록으로 넘어가는 순간.
                wall = 1
                count += count_temp         ## 임시로 담긴 물을 누적.  (블록이 닫혔을때)
                count_temp = 0
                
            if block_ls[i] == 0 and wall == 0:          ## 물이 담길 가능성이 있는 부분을 카운트.
                count_temp += 1
                
        for j in range(len(block_ls)):          ## 맨 아래 블록 한줄 제거.
            if block_ls[j] != 0:            ## -0 으로 블록이 쌓이지 않게 만든 조건.
                block_ls[j] = block_ls[j] - 1
            
    print(count)


if __name__ == "__main__":
    h, w = map(int, inputdata().split())
    block_ls = list(map(int, inputdata().split()))
    # print(block_ls)         # test print
    
    fnContainedRain(h, w)

 

 

 

 

 

추가 하기

예제 입력 2의 예시

import sys
inputdata = sys.stdin.readline


def fnContainedRain(h, w):          ## 2차원으로 쌓인 블록을 아래에서 부터 한줄씩 제거해가며 담긴 빗물을 찾음.
    h_max = max(block_ls)
    
    count = 0           ## 빗물 담긴 사각형의 개수.
    for _ in range(h_max):
        wall = 1            ## 첫 경계가 생기는 순간을 위해 1로 초기화.
        count_temp = 0          ## 가로 한줄에 담긴 빗물 사각형의 개수.
        print(block_ls)         # test print
        for i in range(1, w):           ## 맨 아래 가로 한줄을 탐색.
            if block_ls[i] != block_ls[i - 1] and block_ls[i] == 0:         ## 블록에서 빈 경계로 넘어가는 순간.
                wall = 0
            elif block_ls[i] != block_ls[i - 1] and block_ls[i] != 0:           ## 빈 곳에서 블록으로 넘어가는 순간.
                wall = 1
                count += count_temp         ## 임시로 담긴 물을 누적. (블록이 닫혔을때)
                count_temp = 0
                
            if block_ls[i] == 0 and wall == 0:          ## 물이 담길 가능성이 있는 부분을 카운트.
                count_temp += 1
                
            print(f'i: {i}')            # test print
            print(f'count_temp: {count_temp}')          # test print
        
        
        for j in range(len(block_ls)):          ## 맨 아래 블록 한줄 제거.
            if block_ls[j] != 0:            ## -0 으로 블럭이 쌓이지 않게 만든 조건.
                block_ls[j] = block_ls[j] - 1
            
    print(count)


if __name__ == "__main__":
    h, w = map(int, inputdata().split())
    block_ls = list(map(int, inputdata().split()))
    # print(block_ls)         # test print
    
    fnContainedRain(h, w)



# 4 8
# 3 1 2 3 4 1 1 2


# [3, 1, 2, 3, 4, 1, 1, 2]
# i: 1
# count_temp: 0
# i: 2
# count_temp: 0
# i: 3
# count_temp: 0
# i: 4
# count_temp: 0
# i: 5
# count_temp: 0
# i: 6
# count_temp: 0
# i: 7
# count_temp: 0

# [2, 0, 1, 2, 3, 0, 0, 1]
# i: 1
# count_temp: 1
# i: 2
# count_temp: 0
# i: 3
# count_temp: 0
# i: 4
# count_temp: 0
# i: 5
# count_temp: 1
# i: 6
# count_temp: 2
# i: 7
# count_temp: 0

# [1, 0, 0, 1, 2, 0, 0, 0]
# i: 1
# count_temp: 1
# i: 2
# count_temp: 2
# i: 3
# count_temp: 0
# i: 4
# count_temp: 0
# i: 5
# count_temp: 1
# i: 6
# count_temp: 2
# i: 7
# count_temp: 3

# [0, 0, 0, 0, 1, 0, 0, 0]
# i: 1
# count_temp: 0
# i: 2
# count_temp: 0
# i: 3
# count_temp: 0
# i: 4
# count_temp: 0
# i: 5
# count_temp: 1
# i: 6
# count_temp: 2
# i: 7
# count_temp: 3


# 5