백준14719: 빗물
빗물 성공
1 초 | 256 MB | 7497 | 4085 | 3209 | 55.005% |
문제
2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.


비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?
입력
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
따라서 블록 내부의 빈 공간이 생길 수 없다. 또 2차원 세계의 바닥은 항상 막혀있다고 가정하여도 좋다.
출력
2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.
빗물이 전혀 고이지 않을 경우 0을 출력하여라.
예제 입력 1 복사
4 4
3 0 1 4
예제 출력 1 복사
5
예제 입력 2 복사
4 8
3 1 2 3 4 1 1 2
예제 출력 2 복사
5
예제 입력 3 복사
3 5
0 0 0 2 0
예제 출력 3 복사
0
힌트
힌트 1:

힌트 2:

힌트 3:

출처
사고 과정
비가 오면 블록 사이에 물이 고인다.
물이 고이려면 고일 수 있는 구덩이가 있어야 한다.
bfs나 dfs를 이용하면 될 것 같은데
입력이
4 4
3 0 1 4
이런식으로 주어진다
0 0 0 1
1 0 0 1
1 0 0 1
1 0 1 1
이런식으로 배열을 구성해주면 될 것 같다
하나만 더
4 8
3 1 2 3 4 1 1 2
0 0 0 0 1 0 0 0
1 0 0 1 1 0 0 0
1 0 1 1 1 0 0 1
1 1 1 1 1 1 1 1
물이 차기 위한 조건.
우선 옆에 벽이 있어야 한다.
좌측 하단부터 오른쪽으로
처음 벽을 만나면 cnt를 활성화시키고
벽을 만나면 전체값에 cnt만큼 더해주고
벽을 만나지 못하면 cnt값을 초기화 시켜주는 방식
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int arr[501][501];
int N, M;
int main() {
int answer = 0;
cin >> N >> M;
int k = 0;
for (int i = 0; i < M; i++) {
cin >> k;
int idx = N-1;
for (int j = 0; j <k; j++) {
arr[idx--][i] = 1;
}
}
//for (int i = 0; i < N; i++) {
// for (int j = 0; j < M; j++) {
// cout << arr[i][j];
// }cout << endl;
//}
for (int i = N - 1; i >= 0; i--) {
int cnt = 0;
bool start = false;
for (int j = 0; j < M; j++) {
if (arr[i][j] == 1) {
if (start == false) {
start = true;
continue;
}
else if (start == true) {
answer += cnt;
cnt = 0;
}
}
if (start == true && arr[i][j] == 0)
cnt++;
}
}
cout << answer;
return 0;
}
너무 쉬웠다. 그리고 볼드체로 글을 쓰면 코드가 제대로 나온다는 꿀팁도 알아버렸당.