코딩/백준

[백준]14179번 빗물 - C++

최선을 다하는 2022. 11. 28. 20:14

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

 

14719번: 빗물

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

www.acmicpc.net


문제

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

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

입력

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

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

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

출력

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

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

 


빗물은 해당 높이에서 두개의 블록으로 둘려 싸였을 때 그 사이 위치에 빗물이 고이게 된다.

#include <iostream>
#include <queue>
using namespace std;

int W,H,lv,ans = 0;
int arr[501];
int main (){
    cin >> H >> W;
    for(int i = 0;i < W;i++)
        cin >> arr[i];
    for(int lv = H; lv > 0 ; lv--){
        queue <int> q;
        for(int i = 0 ; i < W; i++){
            if(arr[i] >= lv)
                q.push(i);
        }
        while(q.size() > 1){
            int s = q.front(); q.pop();
            int e = q.front();
            ans += e - s - 1;
            
        }
    }
    cout << ans;
}

문제 풀이를 생각하는데 시간을 쓰고 문제를 풀면서 알맞은 자료구조를 입력했다. 그렇게 어렵지 않은 구현 방식이라 그랬지만 코드를 작성하기 전에 어떤 자료구조를 쓸 지도 정하고 갔으면 좋았을 것 같다!

'코딩 > 백준' 카테고리의 다른 글

[백준] 15686번 치킨 배달 - C++  (1) 2022.12.01
[백준] 16928번 뱀과 사다리 게임 - C++  (0) 2022.12.01
[백준]2660번 회장 뽑기 - C++  (1) 2022.11.26
[백준]2170번 선 긋기 - C++  (0) 2022.11.25
[백준]2212번 센서  (0) 2022.11.24