백준 14719 - 빗물
1 minute read
문제링크
문제설명
- 2차원 격자 위에 블록이 쌓여 있다.
- 비가 오면 블록 사이에 빗물이 고이는데, 고이는 빗물의 총량을 구하라.
문제접근
- 빗물이 고이기 위해서는 좌우에 블록이 있어야만 한다.
- 비어 있는 칸의 좌측, 우측을 탐색하여 양쪽에 블록이 모두 존재하는 경우 빗물 총량을 추가한다.
구현
#include <iostream>
#include <vector>
using namespace std;
int H, W;
int board[500][500];
bool checkLeft(int x, int y) {
for (int c = y - 1; c >= 0; c--) {
if (board[x][c] == 1) return true;
}
return false;
}
bool checkRight(int x, int y) {
for (int c = y + 1; c < W; c++) {
if (board[x][c] == 1) return true;
}
return false;
}
int getRain() {
int ans = 0;
for (int r = 0; r < H; r++) {
for (int c = 0; c < W; c++) {
if (board[r][c] == 1) continue;
if (checkLeft(r, c) && checkRight(r, c)) ans++;
}
}
return ans;
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
scanf("%d %d", &H, &W);
int height, r;
for (int i = 0; i < W; i++) {
scanf("%d", &height);
r = H - 1;
for (int j = 0; j < height; j++) {
board[r--][i] = 1;
}
}
printf("%d\n", getRain());
return 0;
}
Leave a comment