백준 14719 - 빗물

Updated:

Java

14719 번 - 빗물

문제

접근 방법

제일 아래서 부터 한 행씩 탐색한다.
처음 벽을 만나고, 또 다른 벽을 만나면 그 사이 거리만큼 빗물을 채운다.

코드

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

public class Main {
	static int n, m, result;
	public static void main(String[] args) throws IOException {
		System.setIn(new FileInputStream("res/mainInput.txt"));	//제출 할 때 주석해야함
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	n = stoi(stk.nextToken());
    	m = stoi(stk.nextToken());

    	int[][] board = new int[n][m];
    	// 초기화
    	int num;
    	stk = new StringTokenizer(br.readLine());
    	for(int i = 0; i < m; i++) {
    		num = stoi(stk.nextToken());
    		for(int j = n - 1; j >= n - num; j--) {
    			board[j][i] = 1;
    		}
    	}
    	// 빗물 채우기
    	int s;
    	for(int i = n - 1; i >= 0; i--) {
    		s = -1;
    		for(int j = 0; j < m; j++) {
    			if(board[i][j] == 1) {
    				// 현재 행에서 처음 벽을 만난게 아닐 때
    				if(s != -1) {
    					for(int k = s; k < j; k++) {
        					if(board[i][k] == 0)
        						board[i][k] = 2;
        				}
    				}
    				s = j;
    			}
    		}
    	}
    	// 빗물 수 세기
    	for(int i = 0; i < n; i++) {
    		for(int j = 0; j < m; j++) {
    			if(board[i][j] == 2)
    				result++;
    		}
    	}
    	System.out.println(result);
    	br.close();
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

할 만한 문제, 금방 풀 수 있는 문제였는데 집중을 못해서 오래 걸렸다.

개선할 점