백준 빗물

KIMYEONGJUN·2026년 3월 21일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
따라서 블록 내부의 빈 공간이 생길 수 없다.
또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.

2차원 세계에서는 한 칸의 용량은 1이다.
고이는 빗물의 총량을 출력하여라.
빗물이 전혀 고이지 않을 경우 0을 출력하여라.

내가 이 문제를 보고 생각해본 부분

입력 처리: 첫 줄에서 세로 길이 H와 가로 길이 W를 받고, 두 번째 줄에서 각 칸의 블록 높이 배열을 입력받는다.
leftMax 배열: 왼쪽에서부터 각 칸까지의 누적 최대 블록 높이를 저장한다. 
예를 들어 왼쪽 끝 첫 칸은 자기 높이, 다음 칸은 이전 최대 높이와 자기 높이 중 큰 값으로 채운다.
rightMax 배열: 오른쪽 끝에서부터 각 칸까지 누적 최대 높이를 저장한다.
빗물 계산: 각 칸별로, 왼쪽 최대 높이와 오른쪽 최대 높이 중 작은 값에서 현재 칸 높이를 뺀 것이 빗물 높이이다. 
음수는 고임물이 없으므로 0으로 무시한다.
결과 출력: 전체 칸에서 고인 빗물 높이 합을 출력한다.

코드로 구현

package baekjoon.baekjoon_33;

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

// 백준 14719번 문제
public class Main1333 {
    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());

        int[] height = new int[W];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < W; i++) {
            height[i] = Integer.parseInt(st.nextToken());
        }

        int[] leftMax = new int[W];
        int[] rightMax = new int[W];

        // 왼쪽에서부터 최대 높이 누적
        leftMax[0] = height[0];
        for (int i = 1; i < W; i++) {
            leftMax[i] = Math.max(leftMax[i - 1], height[i]);
        }

        // 오른쪽에서부터 최대 높이 누적
        rightMax[W - 1] = height[W - 1];
        for (int i = W - 2; i >= 0; i--) {
            rightMax[i] = Math.max(rightMax[i + 1], height[i]);
        }

        int totalWater = 0;
        for (int i = 0; i < W; i++) {
            // 빗물 높이 = 양쪽의 최소 최대높이 - 현재 높이
            int waterHeight = Math.min(leftMax[i], rightMax[i]) - height[i];
            if (waterHeight > 0) {
                totalWater += waterHeight;
            }
        }

        System.out.println(totalWater);
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글