문제 : https://leetcode.com/problems/trapping-rain-water/
땅의 고도를 나타내는 배열이 주어질 때, 비가 내린 후 가둘 수 있는 물의 양을 구해라.
예시로 주어진 [0,1,0,2,1,0,1,3,2,1,2,1] 을 한 번 살펴보자.
예시의 5 인덱스를 보면 가둘 수 있는 물의 양은 양 옆에 있는 고도가 아닌 인덱스 5를 기점으로 왼쪽에 있는 고도 중 가장 높은 것(leftMax)과 오른쪽에 있는 고도 중 가장 높은 것(rightMax)이 관계가 있다.
leftMax와 rightMax를 구했다면 이들 중 더 낮은 고도 - 탐색 중인 고도가 가둘 수 있는 물의 양이다.
인덱스 5를 예로 들면 leftMax = 2(index 3). rightMax = 3(index 7). 이 되고 이들 중 더 낮은 고도는 2다. 그리고 현재 고도는 0(index 5)이므로 인덱스 5에서 가둘 수 있는 물 양은 2가 된다. 만약 leftMax, rightMax 보다 현재 고도가 같거나 더 높다면 가둘 수 있는 물의 양은 0이다. (ex. index 7)
leftMax, rightMax를 구하기 위해 왼쪽에서부터 탐색하면서 가장 높은 고도를 저장하는 배열과, 오른쪽에서부터 탐색하면서 가장 높은 고도를 저장하는 배열을 구한다.
heights(고도) = [0,1,0,2,1,0,1,3,2,1,2,1]
leftMaxArray = [0,1,1,2,2,2,2,3,3,3,3,3]
rightMaxArray = [3,3,3,3,3,3,3,3,2,2,2,1]
i번째 인덱스의 물의 양을 구할 때, leftMax = leftMaxArray[i-1], rightMax = rightMaxArray[i+1]이 된다.
그리고 i번째 인덱스의 가둘 수 있는 물의 양은 min(leftMax, rightMax) - heights[i] 가 된다.
heights[i]가 leftMax, rightMax 보다 같거나 크다면 0.
시간복잡도는 선형복잡도인 O(N).
소스코드 : https://github.com/fpdjsns/Algorithm/blob/master/leetcode/hard/42.%20Trapping%20Rain%20Water.cpp
'알고리즘 문제 > Leetcode' 카테고리의 다른 글
[leetcode][39] Combination Sum (0) | 2020.10.05 |
---|---|
[leetcode][216] Combination Sum III (0) | 2020.09.12 |
[leetcode][295] Find Median from Data Stream (0) | 2020.08.17 |
[leetcode][435] Non-overlapping Intervals (1) | 2020.08.16 |
[leetcode][442] Find All Duplicates in an Array (0) | 2020.08.08 |
댓글