본문 바로가기
백준 문제풀이

[백준][구현] 14719 빗물 c++구현

by 꽁이꽁설꽁돌 2024. 3. 13.
728x90
반응형

목차

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

     

    14719번: 빗물

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

    www.acmicpc.net

    문제

     

    문제 구현 방향

    보이는 대로 바닥을 채우고 블록은 1로 표시하여 2차원 배열로 만들어 직접 반복문을 통해

    카운트하는 방식으로 문제를 풀었다.

     

     

     

     

    문제 풀이 시 주의점

    바닥이 항상 막혀있다는 점과 언제부터 카운트를 할지 시점만 잘 주의해 주면 된다.

     

     

     

    코드 구현

    #include <iostream>
    using namespace std;
    
    
    int ml = 0;  //빗물 세어주기
    int main() {
    	int H, W, i, j, num;
    	cin >> H >> W;
    	int** arr = new int* [H+1];   //바닥은 있다 가정하므로 블록으로 채워준다
    
    	for (i = 0; i < H + 1; i++) 
    	{
    		arr[i] = new int[W];
    		for (int j = 0; j < W; j++) {
    			arr[i][j] = 0; // 0으로 초기화
    		}
    	}
    	for (i = 0; i < W; i++) { 
    		arr[0][i] = 1;   //바닥을 블록으로 채워줌
    	}
    	for (i = 0; i < W; i++) {
    		cin >> num;
    		for (j = 1; j <= num; j++) {
    			arr[j][i] = 1;  //블록만 1로 표시
    		}
    	}
    
    	for (i = H; i >= 0; i--) {
    		bool check1 = false; //시작점 flag신호
    		int s = 0;
    		for (j = 0; j < W; j++) {
    			if (arr[i][j] == 1 && !check1) {   //시작점이 false이고 블록일 경우 시작점을 초기화
    				check1 = true;
    			}
    			else if (arr[i][j] == 0 && check1) { //시작점이 true일 경우 카운트 시작
    				s++;
    			}
    			else if (arr[i][j] == 1 && check1) {  //시작점이 true이고 블록일 경우
    				if (s != 0) {  //카운트가 0이 아닐경우에만 누적해주고 초기화
    					ml += s;
    					s = 0;
    				}
    			}
    		}
    	}
    	cout << ml;
    }

     

    반응형