집(1)
을 방문시 방문기록이 없다면, 그 집을 시작으로 BFS를 실행한다.단지
가 완성된다.#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <algorithm>
using namespace std;
// 지도 map, 방문 위치 visited, 단지수를 저장한 answer
vector<int> map[25]{};
bool visited[25][25];
vector<int> answer;
// BFS 구현
void BFS(int x, int y, int n)
{
// 집의 수
int cnt = 1;
visited[x][y] = true;
queue<pair<int, int>> q;
q.push({ x, y });
// 방향을 나타낸 행렬
int dx[4] = { 0, 0, -1, 1 };
int dy[4] = { -1, 1, 0, 0 };
while (!q.empty())
{
int cur_x = q.front().first;
int cur_y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++)
{
int nx = dx[i] + cur_x;
int ny = dy[i] + cur_y;
// 탐색 위치가 인덱스 범위를 벗어나지 않도록 제한한다.
if (nx > -1 && ny > -1 && nx < n && ny < n && map[nx][ny] == 1)
{
// 방문한 지역이 아닐 경우 기록을 남기고 카운트한다.
if (visited[nx][ny] == false)
{
q.push({ nx, ny });
visited[nx][ny] = true;
cnt++;
}
}
}
}
// BFS가 끝날때 한 단지가 완성되기 때문에 answer 벡터에 집의 개수를 넣어주면 끝.
answer.push_back(cnt);
}
int main(void)
{
int N;
cin >> N;
string temp;
// 지도 초기화.
for (int i = 0; i < N; i++)
{
cin >> temp;
for (int j = 0; j < N; j++)
map[i].push_back(temp[j] - '0');
}
// 방문 기록이 없고 집이 있는 곳이면 BFS탐색을 실시한다.
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
if (visited[i][j] == false && map[i][j] == 1)
BFS(i, j, N);
}
// 오름차순으로 정렬
sort(answer.begin(), answer.end());
// 총 단지의 수(answer 벡터의 길이)와 정렬된 단지(집의 개수)들을 출력한다.
cout << answer.size() << '\n';
for (int i = 0; i < answer.size(); i++)
cout << answer[i] << '\n';
return 0;
}
처음 문제를 접근했을 때 몇가지 실수가 있었다.
queue
에 push
를 해주고 방문기록을 남겨야 하는데 기록을 남기지 않아 집들이 개별적으로 저장되었다.nx와 ny
를 현재 큐에서 뽑아온 값을 사용했어야 했는데 함수의 매개변수로 받아온 값을 사용해 오류가 있었다.map[i][j]
위치에 집이 존재하는지 확인하는 부분이 빠져있었다.탐색하는 과정과 탐색을 실시하는 조건을 좀더 꼼꼼하게 만들어줘야 될 것 같다.