[백준2667] 단지번호붙이기

뚱환·2023년 9월 19일
0

https://www.acmicpc.net/problem/2667

입력

첫 번째 줄에는 지도의 크기 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";
	}

}
profile
https://github.com/lixxce5017/Algoritm_Weekly_Baekjoon

0개의 댓글