오답노트

[그래프] BOJ 2667번 단지번호붙이기 본문

C,C++/코딩테스트

[그래프] BOJ 2667번 단지번호붙이기

권멋져 2022. 5. 21. 19:55
https://www.acmicpc.net/problem/2667
 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

- 문제파악

NxN 배열이 주어지고 배열 내에 값은 0과 1이 주어진다. 1이 상하좌우로 붙어있다면 인접해있다고 한다. 1이 인접한 그룹의 개수(단지의 개수)와 그룹내의 1의 개수(단지 내 건물 개수)를 출력하라

 

-정답

BFS로 풀이했다.

처음에 큐에 푸쉬하는 것도 체크해야한다.

 

#include "bits/stdc++.h"

using namespace std;

int arr[26][26];
int check[26][26];

int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int n;
	cin >> n;

	int dx[] = { 0,0,1,-1 };
	int dy[] = { 1,-1,0,0 };

	string input;

	for (int i = 0; i < n; i++)
	{
		cin >> input;
		int j = 0;
		for (auto c : input)
		{
			int a = c - 0x30;
			check[i][j] = arr[i][j] = a;
			j++;
		}
	}

	queue<pair<int,int>> q;
	vector<int> vec;
	int cnt = 0;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cnt = 0;

			if (arr[i][j] && check[i][j])
			{
				q.push({ i,j });
				check[i][j] = 0;
				while (!q.empty())
				{
					int qx = q.front().first;
					int qy = q.front().second;
					q.pop();
					cnt++;

					for (int k = 0; k < 4; k++)
					{
						int nx = qx + dx[k];
						int ny = qy + dy[k];

						if (nx < 0 || nx >= n) continue;
						if (ny < 0 || ny >= n) continue;

						if (arr[nx][ny] && check[nx][ny])
						{
							check[nx][ny] = 0;
							q.push({ nx ,ny });
							
						}
					}

					
				}

							
			}

			if (cnt)
				vec.push_back(cnt);
		}
	}


	cout << vec.size() << "\n";

	sort(vec.begin(), vec.end());

	for (auto a : vec)
		cout << a << "\n";
	

}

'C,C++ > 코딩테스트' 카테고리의 다른 글

[BFS] BOJ 13549번 숨바꼭질 3  (0) 2022.05.22
[BFS] BOJ 13913번 숨박꼭질 4  (0) 2022.05.22
[그래프] BOJ 11724번 연결 요소의 개수  (0) 2022.05.21
[그래프] BOJ 10866번 덱  (0) 2022.05.17
[그래프] BOJ 10845번 큐  (0) 2022.05.17