알고리즘/문제풀이
[Python] 백준 14719 빗물
정찡이
2021. 8. 7. 18:41
728x90
1. 문제 링크
https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
2. 문제 요약
- 아래 그림과 같이 빗물의 총량을 구하기
3. 아이디어 정리
투 포인터를 이용하여 빗물 총량을 구한다. ⇒ 오른쪽 포인터 최댓값, 왼쪽 포인터 최댓값을 이용해서 빼준다
- 오른쪽 포인터 최대값이 큰 경우, 왼쪽 빗물 구하기 & 왼쪽 이동
- 왼쪽 포인터 최대값이 큰 경우, 오른쪽 빗물 구하기 & 오른쪽 이동
- 예시를 통한 로직 순서
4. 문제 풀이
4-1. 내 풀이
import sys
h, w = map(int, sys.stdin.readline().split()) # 세로, 가로
arr = list(map(int, sys.stdin.readline().split())) # 블록 높이
left = 0
right = w - 1
max_left = arr[left]
max_right = arr[w - 1]
result = 0
# 투포인터
while left < right:
max_left = max(max_left, arr[left])
max_right = max(max_right, arr[right])
# 1. 오른쪽 포인터 최대값이 큰 경우, 왼쪽 빗물 구하기 & 왼쪽 이동
if max_right >= max_left:
result += max_left - arr[left]
left += 1
else:
# 2. 왼쪽 포인터 최대값이 큰 경우, 오른쪽 빗물 구하기 & 오른쪽 이동
result += max_right - arr[right]
right -= 1
print(result)
5. 결론
- 기존 투포인터와 약간 다른 방식 ⇒ 최댓값을 계속 기록하면서 그 수만큼 빼주는 방식
반응형