알고리즘/PS

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

BigmacGood 2022. 3. 17. 00:01

 

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net

 

백준 2667번 단지번호붙이기를 BFS로 풀어봤습니다.

입력이 최대 25자까지 가능해서 string으로 입력을 받았습니다.

단지가 25x25이고 단지의 상하좌우를 체크할 때 오류가 없도록 배열을 27x27로 잡았습니다.

그래프의 정점을 좌표가 되도록 만들었습니다.

 

아래는 전체 코드입니다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <string>
using namespace std;

bool visited[26][26];
int map[27][27];
vector<pair<int, int>> graph[26][26];
vector<int> saveNum;
queue<pair<int, int>> q;

void BFS(int x, int y);

int main() {
	int n;
	int BFSCounter = 0;
	string temp;
	
	cin >> n;
	

	// Get input
	for (int i = 1; i < n+1; i++) {			
		// Get input in string
		cin >> temp;
		for (int j = 1; j < n+1; j++) {
			map[i][j] = temp[j-1] - 48;
		}
	}

	// If the coordinates are within range and there is apart, push to graph
	for (int i = 1; i < n+1; i++) {
		for (int j = 1; j < n+1; j++) {
			if (map[i][j] == 1) {
				if (map[i-1][j]) {
					graph[i][j].push_back(pair<int, int>(i - 1, j));
				}
				if (map[i][j-1]) {
					graph[i][j].push_back(pair<int, int>(i, j - 1));
				}
				if (map[i][j+1]) {
					graph[i][j].push_back(pair<int, int>(i, j + 1));
				}
				if (map[i+1][j]) {
					graph[i][j].push_back(pair<int, int>(i + 1, j));
				}
			}
		}
	}


	for (int i = 0; i < 27; i++) {
		for (int j = 0; j < 27; j++) {
			if (map[i][j] == 1) {
				if (visited[i][j] == 0) {
					BFS(i, j);
					BFSCounter++;
				}
			}
		}
	}

	cout << BFSCounter << '\n';

	sort(saveNum.begin(), saveNum.end());
	for (int i = 0; i < saveNum.size(); i++)
		cout << saveNum[i] << '\n';

	return 0;
}

void BFS(int x, int y) {
	q.push(pair<int, int>(x, y));
	int count = 1;
	visited[x][y] = 1;

	while (!q.empty()) {
		pair<int, int> r = q.front();
		q.pop();

		for (int i = 0; i < graph[r.first][r.second].size(); i++) {
			pair<int, int> k = graph[r.first][r.second][i];

			if (visited[k.first][k.second] == 0) {
				count++;
				visited[k.first][k.second] = 1;
				q.push(graph[r.first][r.second][i]);
			}
		}

	}

	saveNum.push_back(count);
}

 

'알고리즘 > PS' 카테고리의 다른 글

[C++] 백준 7576 : 토마토  (0) 2022.03.18
[C++] 백준 2178 : 미로찾기  (0) 2022.03.18
[C++] 백준 1012 : 유기농 배추  (0) 2022.03.17
[C++] 백준 2606 : 바이러스  (0) 2022.03.15
[C++] 백준 1260 : DFS와 BFS  (0) 2022.03.15