코딩테스트/백준

[백준]14719번 빗물 - Java

GAEBAL 2022. 4. 17. 21:56
728x90

문제

https://www.acmicpc.net/problem/14719

 

14719번: 빗물

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

www.acmicpc.net

 

 

풀이

어떻게 풀지 생각하는데 약간 시간이 걸렸다

제일 왼쪽이랑 오른쪽 블록을 제외한 그 사이에 있는 블록들 머리 위에만 빗물이 쌓일 수 있기 때문에, 그 점을 생각하면 쉽게 풀림!

 

자세한 설명은 주석을 달아놨으니 참고하셈!

 

 

코드

// 14719번 빗물
// https://www.acmicpc.net/problem/14719

package BAEKJOON;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Num14719_빗물 {
    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());

        // 입력
        int H = Integer.parseInt(st.nextToken());
        int W = Integer.parseInt(st.nextToken());

        // 블록들의 높이를 저장하기 위한 배열
        arr = new int[W];

        // 입력
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int answer = 0; // 정답(총 빗물)

        for (int i = 1; i < arr.length - 1; i++) {
            int leftTop = getLeftTop(i);
            int rightTop = getRightTop(i);

            // 자신의 왼쪽이나 오른쪽에 자신보다 큰 블록이 없으면 빗물은 흘러내리니까 continue
            if (leftTop == arr[i] || rightTop == arr[i]) {
                continue;
            }

            // 왼쪽 오른쪽 중 작은애
            int standard = Math.min(leftTop, rightTop);

            // standard에서 현재 블록의 높이를 빼면 현재 블록 위에 있는 빗물
            answer += standard - arr[i];
        }

        System.out.println(answer);
    }

    // 현재 인덱스 기준 왼쪽에서 제일 큰 값 찾기
    private static int getLeftTop(int index) {
        int leftTop = arr[index];

        // 현재 위치부터 처음 인덱스까지
        for (int i = index - 1; i >= 0; i--) {
            if (arr[i] > leftTop) {
                leftTop = arr[i];
            }
        }

        return leftTop;
    }

    // 현재 인덱스 기준 오른쪽에서 제일 큰 값 찾기
    private static int getRightTop(int index) {
        int rightTop = arr[index];

        // 현재 위치부터 마지막 인덱스까지
        for (int i = index + 1; i < arr.length; i++) {
            if (arr[i] > rightTop) {
                rightTop = arr[i];
            }
        }

        return rightTop;
    }
}
728x90