Per ardua ad astra !
I'm On My Way
Per ardua ad astra !
전체 방문자
오늘
어제
  • 분류 전체보기 (126)
    • Algorithm (50)
      • 백준 (30)
      • SWEA (3)
      • JUNGOL (3)
      • Programmers (5)
      • LeetCode (2)
    • 안드로이드 개발 (6)
      • Java로 개발 (0)
      • Kotlin으로 개발 (3)
    • Spring (41)
      • Spring기본 (17)
      • JPA기본 (15)
      • JPA활용 SpringBoot 기본 (9)
      • API 개발 기본 (0)
    • 네트워크 (3)
    • 운영체제 (0)
    • Life (3)
      • 책 (0)
      • 자기계발 (1)
      • 일상 (2)
    • 노마드코더 (3)
      • python으로 웹 스크래퍼 만들기 (3)
    • 프로그래밍 언어 (17)
      • Java 기본 (2)
      • 코틀린 기본 (15)

블로그 메뉴

  • 홈
  • 방명록

인기 글

hELLO · Designed By 정상우.
Per ardua ad astra !

I'm On My Way

Algorithm/LeetCode

LeetCode 42. Trapping Rain Water (Java) (Hard) (DP)

2021. 10. 3. 14:17

문제출처: https://leetcode.com/problems/trapping-rain-water/

 

Trapping Rain Water - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

문제이해

 

목표

하나의 배열이 주어진다. 배열에는 해당 인덱스 자리에 블럭의 높이의 값을 나태나는 정보가 주어진다. 
블럭과 블럭 사이에 빈공간이 있다면 물을 채울 수 있다. 정확한건 그림을 참조하자. 
 compute how much water it can trap after raining. 비가 오고 물이 얼마나 채워질지 구해보자.

 

 

풀이

 

첫번째 고안한 풀이

dp를 이용했다. dp[]에 기억을 하는 값은 다음과 같다.

예시) dp[j] = i => 높이 j가 가장 마지막으로 있었던 인덱스 번호 i  

 

주어진 배열 height만큼 탐색을 하는데 

 -> 그리고 해당 height배열의 인덱스 값(높이h) 만큼을 탐색해서

      => 방문했던 높이가 있다면 그 사이의 길이를 찾아서 물의 개수를 찾는다.

 

물의 개수를 다 찾을 수 있다. 

 

=> 정답은 도출되지만, 시간 복잡도로 봤을 때 실패에 가까운 코드이다. 

     최대 20000 * 100000 의 시간이 경과될 수 있음

 

 

다른 사람 코드를 본 코드

 

각 노드 기준으로 왼쪽 블럭들 중 가장 높은 블럭, 오른쪽 블럭들 중 가장 높은 블럭을 구한다.

그리고 구한 왼쪽, 오른쪽 블럭중 낮은 블럭에 자신의 블럭을 뺐을 때 => 자신의 블럭에 얼마나 물이 찰 수 있는지 알림 

answer += Math.min(right[i], left[i]) - height[i];

 

소스코드

첫번째 코드

import java.util.Arrays;

// https://leetcode.com/problems/trapping-rain-water/
public class TrappingRainWater {
    public int trap(int[] height) {
        int answer = 0;
        int[] dp = new int[100001];
        Arrays.fill(dp, -1);
        for (int i = 0; i < height.length; i++) {
            int h = height[i];
            if(h == 0){
                continue;
            }
            for (int j = 1; j <= h; j++) {
                if(dp[j] != -1){ // 방문했던 적이 있다면
                    answer += i - dp[j] - 1;
                }
                dp[j] = i;
            }
        }
        return answer;
    }
}

 

두번째 코드

import java.util.Arrays;

// https://leetcode.com/problems/trapping-rain-water/
public class TrappingRainWater {
    public int trap(int[] height) {
        int answer = 0;
        int N = height.length;
        int[] left = new int[N];
        int[] right = new int[N];
        int max = 0;
        for (int i = 0; i < N; i++) { // left
            if (max < height[i]) {
                max = height[i];
            }
            left[i] = max;
        }
        max = 0;
        for (int i = N-1; i >= 0; i--) { // right
            if (max < height[i]) {
                max = height[i];
            }
            right[i] = max;
        }
        // 정답 도출
        for (int i = 0; i < height.length; i++) {
            answer += Math.min(right[i], left[i]) - height[i];
        }
        return answer;
    }
}

 

    'Algorithm/LeetCode' 카테고리의 다른 글
    • LeetCode 152. Maximum Product Subarray (Java) (Medium) (DP)
    Per ardua ad astra !
    Per ardua ad astra !
    개발자 지망생이며 열심히 공부하고 기억하기 위한 블로그입니다.

    티스토리툴바