https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
문제
2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.
![](https://blog.kakaocdn.net/dn/CO8qA/btrSjvOH9J2/k9T4wwAaOwPhs3pqDwBJt1/img.png)
![](https://blog.kakaocdn.net/dn/k4L2a/btrSlYCl0LE/9XC2WwkKhPJwvQpmW66eGk/img.png)
비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?
입력
첫 번째 줄에는 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 |