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

 

14719번: 빗물

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

www.acmicpc.net

코드설명

구현과 시뮬레이션을 활용하는 문제입니다.

 

문제로직입니다.

  1. 맨 첫번쨰 공간, 맨 마지막 공간에는 물이 고일 수 없습니다. (첫번째 공간에는 왼쪽벽이 없고, 마지막 공간에는 오른쪽벽이 없음)
  2. 각 공간마다의 높이를 구해나갑니다. 이 문제에서 가장 중요한 점은, 왼쪽의 최대벽 높이와, 오른쪽의 최대벽 높이를 각각의 벽마다 구한뒤, 왼쪽의 최대벽 높이와 오른쪽의 최대벽 높이의 최소값을 더해주면 해당 벽에 고일 수 있는 물의 양이 구해집니다.

 

코드에 자세한 주석을 정리해보았습니다.

 

코드

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

public class Main {
	public static int H, W;
	public static int[] arr;
	public static int answer = 0;
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	H = Integer.parseInt(st.nextToken());
    	W = Integer.parseInt(st.nextToken());
    
    	arr = new int[W];
    	st = new StringTokenizer(br.readLine());
    	for(int i=0;i<W;i++) {
    		arr[i] = Integer.parseInt(st.nextToken());
    	}
    	
    	for(int i=1; i<W-1; i++) { //맨 첫번째 공간, 맨 마지막 공간에는 각각 왼쪽과 오른쪽에 벽을 세울수 없으므로 물을 채울 수 없습니다. 
    		int currentHeight = arr[i];
    		int leftMaxHeight = currentHeight;
    		int rightMaxHeight = currentHeight;
    		for(int k=i-1; k>=0;k--) { //왼쪽 최대벽 높이를 탐색합니다.
    			if(leftMaxHeight < arr[k]) {
    				leftMaxHeight = arr[k];
    			}
    		}
    		
    		for(int k=i+1; k < W; k++) { //오른쪽 최대벽 높이를 탐색합니다.
    			if(arr[k] > rightMaxHeight) {
    				rightMaxHeight = arr[k];
    			}
    		}
    		
    		int shorterHeight = Math.min(leftMaxHeight, rightMaxHeight); // 왼쪽 최대높이와 오른쪽 최대높이 중 더 짧은 높이로 물이채워집니다.
    		if(shorterHeight > currentHeight) { //만약 현재 벽보다 양옆의 벽중 하나라도 더 작다면, 계싼하지 않음. 둘다 커야만 물이 차기에 계산처리
    			answer +=  shorterHeight - currentHeight;
    		}
    	}
    	System.out.println(answer);
    	
    }
       
}

+ Recent posts