PS/LeetCode

42. Trapping Rain Water - Streak 12

조금씩 차근차근 2025. 9. 25. 10:53

가장 간단한 풀이 - O(n*h[i])
양 옆에 이것보다 큰 숫자가 있었던 적이 있으면 물이 담길 수 있게 된다.
물은 양 방향 중 작은 숫자 - 현재 높이만큼 담길 수 있다.

 

즉 우리에게 필요한 것은 양 방향의 가장 큰 숫자이다.
이는 배열 양쪽 방향으로 스윕하는 전처리를 수행하면 O(1)만에 구할 수 있다.

 

시간복잡도: O(n)

너무 쉬워서 유사 문제가 있나 봤더니
백준 14719 빗물 - Gold V 문제가 있었다.

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int[] prefix = new int[n+1];
        int[] suffix = new int[n+1];

        int left = 0;
        for(int i = 0; i<n; i++){
            prefix[i] = left;
            left = Math.max(left, height[i]);
        }

        int right = 0;
        for (int i = n-1; i>=0; i--){
            suffix[i] = right;
            right = Math.max(right, height[i]);
        }

        int ret = 0;
        for(int i = 0; i<n; i++){
            int can = Math.min(prefix[i], suffix[i]) - height[i];
            ret += Math.max(0, can);
        }
        return ret;
    }
}