https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
순간 문제를 보자마자 보이는 2차원 격자무늬 그림에 이거 2차원 배열 써야하나 싶었다.
그러나 그런 문제는 아니었고 숫자를 받아서 배열 생성하는 뻘짓을 안한 것만 해도 감사하다.
left_wall = arr[0]
ans = 0
ansList = [0]
for i in range(1, m):
if arr[i] < left_wall:
ans += left_wall-arr[i]
elif arr[i] >= left_wall:
left_wall = arr[i]
ansList.append(ans)
ans = 0
print(left_wall, ans, ansList)
print(ansList)
print(sum(ansList))
다양한 뻘짓을 했는데 그나마 다행인건 투포인터 문제인데 포인터 비스무리하게 left_wall 잡고 갔다는 것이다.
투포인터라는 문제가 있는 줄도 모르는데 혼자 머리로 이만큼 했음 잘했지!!
import sys
sys.stdin = open('input.txt', 'r')
h, w = map(int, input().split())
arr = list(map(int, input().split()))
leftIdx = 0
rightIdx = w-1
leftMax = arr[leftIdx]
rightMax = arr[rightIdx]
ans = 0
#투포인터
while leftIdx < rightIdx:
leftMax = max(leftMax, arr[leftIdx])
rightMax = max(rightMax, arr[rightIdx])
#오른쪽 포인터 최대값이 큰 경우, 왼쪽 빗물 구하기 & 왼쪽 이동
if rightMax > leftMax :
ans += leftMax - arr[leftIdx]
leftIdx += 1
#왼쪽 포인터 최대값이 큰 경우, 오른쪽 빗물 구하기 & 오른쪽 이동
else:
ans += rightMax - arr[rightIdx]
rightIdx -= 1
print(ans)
그래서 답은 구글 스승님이 알려줌...
이동하는 인덱스를 계속 업데이트 한다는 것과,
최대값을 비교해서 오른쪽이 크면 왼쪽을 이동하고, 왼쪽이 크면 오른쪽을 이동한다는 것 자체가 새로웠다.
'Algorithm > 백준 BOJ' 카테고리의 다른 글
[백준] [Python] #2869 달팽이는 올라가고 싶다 (0) | 2021.11.13 |
---|---|
[백준] [Python] #1062 가르침 (0) | 2021.09.25 |
[백준] [Python] #9012 괄호 (0) | 2021.09.25 |
[백준] [Python] #2504 괄호의 값 (0) | 2021.09.25 |
[백준] [Python] #1158 요세푸스 문제 (0) | 2021.09.24 |
댓글