백준

[백준 14719 with JAVA] 빗물

종식당 2025. 1. 29. 14:50
728x90
반응형



 


  • 문제설명
    먼저 첫 번째 줄에 세로, 가로의 길이가 입력되고 두 번째 줄에 가로길이의 개수만큼 숫자들을 입력받는다. 
    두 번째 줄의 숫자는 블록이 높이이다. 위 힌트 사진을 보면 이해하기 수월할 것이다.
    이 블록들 사이에 빗물의 고이는데 고인 빗물의 총합을 구해 출력하면 된다.
  • 제출코드     
import java.util.*;
import java.io.*;

public class Main{
    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 [] block = new int[W];
        int [] rain = new int[W];

        st = new StringTokenizer(br.readLine());

        int height = 0;
        int result = 0;

        for (int i = 0; i < W; i++){
            block[i] = Integer.parseInt(st.nextToken());
            height = Math.max(height, block[i]);
            rain[i] = height;
        }

        height = 0;

        //첫번째줄, 마지막줄 빗물 안고임
        for(int i = W-1; i >= 0 ; i--){
            height = Math.max(height,block[i]);
            rain[i] = Math.min(height, rain[i]);
            result += (rain[i] - block[i]);
        }
        
        System.out.println(result);
    }
}

 

  • 코드설명
    먼저 가로길이만큼의 숫자들을 입력받아 block배열에 저장한다. 그리고 rain배열에는 각 칸의 블록의 높이와 이전부터 각 칸까지의 최댓값을 비교해 최대 높이 값들을 저장한다. 
    3 1 2 3 4 1 1 2 이렇게 입력받는다면 block배열에는 차례대로 들어갈 것이고 rain배열에는 3 3 3 3 4 4 4 4 이렇게 들어갈 것이다.
    그리고 이번에는 역으로 for문을 돌려 각 칸에서의 최대 높이 값을 구해줄 것이다. 그리고 이 값과 rain배열의 값과 비교해 더 작은 값을 저장해 줄 것이다.
    height에는 4 4 4 4 4 2 2 2 이렇게 들어갈 것이고 rain배열에는 3 3 3 3 4 2 2 2 이렇게 들어갈 것이다.
    그 후 rain에서 block을 뺀 만큼 빗물이 고일테니 이 값들을 for문을 돌면서 총합을 구하면 된다.

728x90
반응형