단지번호붙이기(백준)

108번뇌·2021년 5월 1일
0

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

const int Max = 25;
int N;
int DirX[4] = { -1,0,1,0 };
int DirY[4] = { 0,-1,0,1 };
int iCnt = 0;
char vvContents[25][25];
int vvChk[Max][Max] = { 0, };
vector<int> vDanji;



bool cmp(int x, int y)
{
	return x < y; //내림차순 반환입니다.
}

void BFS(int x, int y)
{
	queue<pair<int, int>> qTemp;
	qTemp.push(make_pair(x, y));
	vvChk[x][y] = 1;
	iCnt++;

	while (!qTemp.empty())
	{
		int iX = qTemp.front().first;
		int iY = qTemp.front().second;
		qTemp.pop();
		for (int i = 0; i < 4; i++)
		{
			int iNX = iX + DirX[i];
			int iNY = iY + DirY[i];
			if ((vvChk[iNX][iNY] == 0) && (iNX >= 0) && (iNX < N) && (iNY >= 0) && (iNY < N) && (vvContents[iNX][iNY] == '1'))
			{
				iCnt++;
				vvChk[iNX][iNY] = 1;
				qTemp.push(make_pair(iNX, iNY));
			}
		}
	}
}
int main()
{
	cin >> N;


	for (int i = 0; i < N; i++)
		cin >> vvContents[i];


	

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if ((vvChk[i][j] == 0) && (vvContents[i][j] == '1'))
			{
				BFS(i, j);
				vDanji.push_back(iCnt);
				iCnt = 0;
			}
		}
	}

	sort(vDanji.begin(), vDanji.end(), cmp);

	cout << vDanji.size() << endl;


	for (int i = 0; i < vDanji.size(); i++)
	{
		cout << vDanji[i] << endl;
	}

	return 0;
}

이거 풀면서 해맸던게,
기존의 BFS와 다르게 0과 1 배열에서 끊긴부분(1이 연속적이지 않음)

  1. 끊긴부분을 위한 이중포문 만들어야함

  2. 끊긴부분을 구역별로 처리하기 위한 vector vDanji선언해야함.

  3. 백준풀때 배열 인풋 귀찮은데
    char vvContents[25][25];

    for (int i = 0; i < N; i++)
    cin >> vvContents[i];
    이런식으로 선언하고, 까먹지말고 vvContents[i][j] == '1'해줘야함. 문자열로 처리해준다. !=0으로 해서 empty한곳도 처리되서 계속 해맸음.

profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글