문제 분석
- 문제 개요:
주어진 높이 hh 와 너비 ww 의 2차원 공간에서, 블록이 쌓인 형태가 주어진다.
이때 빗물이 고일 수 있는 칸의 개수를 구하는 문제이다.
- 핵심 개념:
- 특정 위치에 빗물이 고이려면 왼쪽과 오른쪽에 블록이 있어야 한다.
- 각 칸에서 왼쪽과 오른쪽에 블록이 있는지 확인하는 방식으로 문제를 해결
코드 설명
#include <bits/stdc++.h>
using namespace std;
template <typename Iterator>
bool Check(Iterator start, Iterator end)
{
for (; start != end; ++start)
{
if (*start) return true;
}
return false;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int h, w;
cin >> h >> w;
vector<vector<bool>> v(h, vector<bool>(w));
// 블록 입력
for (int i = 0; i < w; i++)
{
int input;
cin >> input;
for (int j = 0; j < input; j++)
{
v[j][i] = true;
}
}
int answer = 0;
// 빗물 계산
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
if (v[i][j] == true) continue; // 블록이 있는 곳은 제외
// 현재 위치의 오른쪽과 왼쪽에 블록이 있는지 확인
if (Check(v[i].begin() + j, v[i].end()) && Check(v[i].rbegin() + (w - j), v[i].rend()))
answer++;
}
}
cout << answer;
}