풀이 전략
- 0인 부분을 어쨋든 모두다 탐색을 해야 하므로 , dfs로 접근하자.
- dfs가 한번 호출된다면, 해당 dfs 함수에서 0인 부분을 확인해서
재귀형태로 dfs를 호출하는 방식으로
- dfs가 종료되는 부분은 상하좌우 칸씩을 확인하면서, 조건에 만족하지 않을 때 함수를 뛰쳐나옴.
알아야 할 것들
- 여러자리수로 입력되는 것을 한자리로 받기
: 내 벨로그에 있음.
- 2차원 벡터에 입력되는 값 넣어서 크기 할당하기
: 내 벨로그에 있음.
코드
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <iostream>
#include <list>
#include <algorithm>
//필요한 것들
// 한 자리씩 받기
// 2차원벡터에 넣기
bool dfs(int _x, int _y, vector<vector<int>>&_v)
{
// 0 인부분만 파고 들자.
// 그러다가 0이 아닐 경우에는 카운팅을 하고 뛰쳐 나오자.
// 인덱스 확인하는 부분.
if (_x < 0 || _x >= _v.size()
|| _y < 0 || _y >= _v[0].size())
return false;
if (_v[_x][_y] == 1)
return false;
//외부에서 카운팅을 돌려서 콜되는 순간만 카운팅을 하자.
if (_v[_x][_y] == 0)
{
_v[_x][_y] = 1;
// 상 하 좌 우 확인하는 방법으로 접근하자.
dfs(_x, _y + 1, _v);
dfs(_x, _y - 1, _v);
dfs(_x + 1, _y, _v);
dfs(_x - 1, _y, _v);
}
return true;
}
int main()
{
int n, m;
cin >> n >> m;
vector<vector<int>>v(n, vector<int>(m,0));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf("%1d", &v[i][j]);
}
}
int cnt{ 0 };
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (dfs(i, j, v))
{
++cnt;
}
}
}
cout << cnt;
}