첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5≤N≤25)이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.
첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (arr[i][j] == 1 && visitied[i][j] == false)
{
bfs(i, j);
sumN++;
}
핵심부분 미로찾기 처럼 상하좌우 1씩 dfs를 돌리며
각 루프 마다 i,j가 값이 있고 보지 않았다면 돌리고
번지 카운트 값을 ++ 하며 돌림
bfs에서는 총카운트 값을 새로 만들며 백터에 저장 후 제일 큰 값을 출력
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
int arr[26][26];
int sumN = 0;
bool visitied[26][26] = { false, };
typedef pair<int, int> Node;
int n;
vector<int>result;
void bfs(int i, int j)
{
queue<Node>myque;
myque.push(Node(i, j));
visitied[i][j] = true;
int cnt = 0;
cnt++;
while (!myque.empty())
{
Node now = myque.front();
int xx = now.first;
int yy = now.second;
myque.pop();
for (int i = 0; i < 4; i++)
{
int nx = dx[i] + xx;
int ny = dy[i] + yy;
if (nx >= 0 && ny >= 0 && nx < n && ny < n)
{
if (visitied[nx][ny] == false && arr[nx][ny] == 1)
{
myque.push(Node(nx, ny));
visitied[nx][ny] = true;
cnt++;
}
}
}
}
result.push_back(cnt);
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++) {
string str;
cin >> str;
for (int j = 0; j < str.length(); j++) { //입력 주의
if (str[j] == '1') {
arr[i][j] = 1;
}
else arr[i][j] = 0;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (arr[i][j] == 1 && visitied[i][j] == false)
{
bfs(i, j);
sumN++;
}
}
}
cout << result .size()<<"\n";
sort(result.begin(), result.end());
for (int i = 0; i < result.size(); i++)
{
cout << result[i]<<"\n";
}
}