

내가 생각했을때 문제에서 원하는부분
첫 번째 줄에는 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();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.