[백준] 14719 빗물

문제링크 : https://www.acmicpc.net/problem/14719

 

14719번: 빗물

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치

www.acmicpc.net

import java.io.*;
import java.util.*;

public class BJ14719HJ {
    static int h, w, rain, wall_max, idx, wall, wall2, sum;
    static int[] arr;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        h = Integer.parseInt(st.nextToken());
        w = Integer.parseInt(st.nextToken());
        arr = new int[w];
        st = new StringTokenizer(br.readLine());
        for (int i=0; i<w; i++){
            int input = Integer.parseInt(st.nextToken());
            arr[i] = input;
            sum += input;   // 블럭 높이 모두 더해 놓음
        }

        // 가장 높은 블록 & idx 찾기
        for (int i=0; i<w; i++){
            if (arr[i] > wall_max){
                wall_max = arr[i];
                idx = i;
            }
        }

        // 블럭 최대 높이의 합을 구한 후, 본 배열의 합을 빼주면 고여 있는 빗물의 양이 됨.
        for (int i=0; i<idx+1; i++){
            if (arr[i] > wall){
                wall = arr[i];
            }
            rain += wall;
        }

        for (int i=w-1; i>idx; i--){
            if (arr[i] > wall2){
                wall2 = arr[i];
            }
            rain += wall2;
        }

        System.out.println(rain - sum);
    }
}

문제 해설 :

1. 최대높이를 기준으로 양옆으로 탐색

2. 고인 빗물의 양 = 배열을 탐색할 때 마다 갱신된 최대높이의 합 - 기존배열의 블럭의 합

즉, 빗물이 차있을 때의 블럭의 높이를 구한 후, 원래 블럭 높이만 빼주는 것

'Algorithm > Java' 카테고리의 다른 글

[백준] 17281 ⚾ (야구)  (0) 2024.04.17
[백준] 8979 올림픽  (0) 2024.04.11
[백준] 1864 스카이라인 쉬운거  (0) 2024.04.08
[백준] 2146 다리 만들기  (0) 2024.03.25
[백준] 14658 하늘에서 별똥별이 빗발친다  (0) 2024.03.14