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

문제 (Gold 5)

2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.

비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?

입력

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)

두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.

따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.

출력

2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.

빗물이 전혀 고이지 않을 경우 0을 출력하여라.

문제 풀이

  • 제일 위쪽부터 시작해서 빗물이 고일 수 없는 부분을 체크
    - 왼쪽과 오른쪽에서 출발하여 블록 or 끝을 만날 때까지 -1을 채우며 이동

    위와 같은 예제에서 다음과 같은 순서로 빗물이 고일 수 없는 부분을 체크

  • 첫 번째는 왼쪽과 오른쪽 모두 블록을 만날 때까지 이동하며 -1을 채움
  • 두 번째는 왼쪽의 경우 바로 블록을 만났기 때문에 채우지 않으며 오른쪽만 블록을 만날 때까지 -1을 채움
  • 양쪽 모두 바로 블록을 만났을 경우 반복문을 탈출하고 빗물이 고일 수 있는 영역(Array에서 0인 영역)의 개수를 출력

코드

#include <iostream>

using namespace std;

int arr[501][501];

int main() {
    int H, W;
    cin >> H >> W;
    
    int n;
    for(int j=0; j<W; ++j) {
        cin >> n;
        for(int i=0; i<n; ++i) {
            arr[i][j] = 1;
        }
    }
    
    for(int i=H-1; i>=0; --i) {
        int l = 0, r = W-1;
        
        if(arr[i][l] == 1 && arr[i][r] == 1) break;

        while(arr[i][l] == 0) {
            arr[i][l] = -1;
            l++;
        }
        
        while(arr[i][r] == 0) {
            arr[i][r] = -1;
            r--;
        }
    }
    
    int answer = 0;
    for(int i=0; i<H; ++i) {
        for(int j=0; j<W; ++j) {
            if(arr[i][j] == 0) answer++;
        }
    }
    
    cout << answer;
    
    return 0;
}

문제 링크

14719번: 빗물

좋은 웹페이지 즐겨찾기