CodingTest/백준

[백준] BOJ 14719 빗물 (골드 5)

브디크리 2024. 4. 10. 16:58

문제


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

 

14719번: 빗물

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

www.acmicpc.net


해설



  1. 각 행(H)마다 left(왼쪽 벽) right(오른쪽 벽)을 구한다. (각각 가장 왼쪽, 가장 오른쪽)
  2. 가장 왼쪽, 가장 오른쪽 벽 사이에 벽이 아닌 곳은 물이 고인다.
  3. 반복문을 통해 왼쪽벽부터 오른쪽 벽 사이에 물이 고일 수 있는 공간의 크기를 구한다.

코드


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

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        StringTokenizer st = new StringTokenizer(br.readLine());
        int H = Integer.parseInt(st.nextToken());
        int W = Integer.parseInt(st.nextToken());
        int[][] map = new int[H][W];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < W; i++) {
            int height = Integer.parseInt(st.nextToken());
            for (int j = 0; j < height; j++) {
                map[j][i] = 1;
            }
        }
        sb.append(rain(H, W, map));
        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }

    private static int rain(int h, int w, int[][] map) {
        int sum = 0;
        for (int i = 0; i < h; i++) {
            int left = -1;
            int right = -1;
            for (int j = 0; j < w; j++) {
                boolean check = map[i][j] == 1;
                if (check) {
                    right = j;
                }
                if (check && left == -1) {
                    left = j;
                }
            }

            for (int j = left; j < right; j++) {
                if (map[i][j] == 0) {
                    sum++;
                }
            }
        }
        return sum;
    }
}