728x90
📌 문제
https://www.acmicpc.net/problem/14719
📌 문제 접근 방법
- 우선 블록들 중에서 가장 높이가 높은 블록을 찾는다.
- 그 블록을 기준으로 왼쪽과 오른쪽으로 나눠서 탐색한다.
이하 가장 높이가 높은 블록을 기준 블록, 0번 부터 기준 블록의 왼쪽인덱스까지를 왼쪽 그룹,
기준 블록의 오른쪽인덱스부터 마지막 인덱스까지를 오른쪽 그룹이라 칭하겠다. - 기준 블록의 왼쪽 인덱스부터 시작하여 0번 인덱스까지 왼쪽 그룹에서 가장 높이가 큰 블록을 찾는다.
여기서 찾은 블록과 기준 블록 사이의 블록들은 빗물이 고일 수 있다. - 빗물이 고이는 블록들은 (3에서 찾은 블록의 높이 - 자신의 높이) 만큼 빗물이 고이므로, 이를 result에 저장한다.
- 3에서 찾은 블록을 기준 블록으로 왼쪽으로 계속 탐색해 나간다. 기준 블록이 0이 되면 탐색을 멈춘다.
- 오른쪽 그룹도 마찬가지로 진행한다. 기준 블록이 W-1이 되면 탐색을 멈춘다.
📌 코드
# 백준 14719 빗물
def left(idx):
global result
if idx == 0:
return
temp = blocks[:idx]
high = max(temp)
for i in range(idx-1, -1, -1):
if blocks[i] == high:
for j in range(i+1, idx):
result += high - blocks[j]
left(i)
return
def right(idx):
global result
if idx == W-1:
return
temp = blocks[idx+1:]
high = max(temp)
for i in range(idx+1, W):
if blocks[i] == high:
for j in range(idx+1, i):
result += high - blocks[j]
right(i)
return
H, W = map(int, input().split())
blocks = list(map(int, input().split()))
result = 0
for i in range(W):
if blocks[i] == max(blocks):
# 인덱스, 높이
left(i)
right(i)
break
print(result)
728x90
'ALGORITHM > BAEKJOON' 카테고리의 다른 글
[BOJ/Python] 14888. 연산자 끼워넣기 (0) | 2021.12.02 |
---|---|
[BOJ/Python] 5052. 전화번호 목록 (0) | 2021.10.30 |
[BOJ/Python] 2688. 줄어들지 않아 (0) | 2021.10.28 |
[BOJ/Python] 20057. 마법사 상어와 토네이도 (0) | 2021.10.28 |
[BOJ/Python] 4948. 베르트랑 공준 (0) | 2021.10.21 |
댓글