파이썬 백준 14719번
골드 5
https://www.acmicpc.net/problem/14719
문제 보기
분류: 구현, 시뮬레이션
문제 풀기
맨 아래 블록을 한 줄씩 제거해가며 그 라인에 물이 담긴 사각형의 개수를 누적하여 더한다.
블록이 저장된 리스트를 왼쪽에서 오른쪽으로 관찰을 진행하며
블록이 있는 곳에서 없는 곳으로 바뀌는 조건
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
'공부하기 > 백준' 카테고리의 다른 글
[Python] 백준 풀기 1316 - 그룹 단어 체커 (0) | 2022.12.24 |
---|---|
[Python] 백준 풀기 2720 - 세탁소 사장 동혁 (0) | 2022.12.23 |
[Python] 백준 풀기 1439 - 뒤집기 (0) | 2022.12.21 |
[Python] 백준 풀기 11656 - 접미사 배열 (0) | 2022.12.20 |
[Python] 백준 풀기 2748 - 피보나치 수 2 (0) | 2022.12.19 |