본문 바로가기
Problem Solving/백준

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

by shinbian11 2020. 6. 21.

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net


<C++>

#include <bits/stdc++.h>
using namespace std;
int n;
int house[26][26] = { 0 };
int danji_max[1000]; //index 1을 1단지로 하기! index 1부터 출력!
int danji_index = 0;
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} }; //한 점으로 부터의 UP,DOWN,RIGHT,LEFT
int isinside(int y, int x) //그 점이 지도 안에 위치해야한다. 위치하는 지 판정하는 함수!
{
	int chk = ((y >= 0 && y < n) && (x >= 0 && x < n)) ? 1:0; //만약 지도 안에 위치하면 1 반환
	return chk;
}
void dfs(int cur_y, int cur_x, int danji_index)
{
	house[cur_y][cur_x] = 0;
	danji_max[danji_index]++;
	int next_y, next_x;
	for (int i = 0; i < 4; i++)
	{
		next_y = cur_y + dir[i][0]; //cur_y에서 위,아래,오른,왼쪽 점들 모두 하나하나 확인
		next_x = cur_x + dir[i][1]; //cur_x에서 위,아래,오른,왼쪽 점들 모두 하나하나 확인
		if (isinside(next_y, next_x) == 1 && house[next_y][next_x] == 1)
		{
			dfs(next_y, next_x, danji_index);
		}
	}
}
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			scanf("%1d", &house[i][j]);
		}
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (house[i][j] == 1) //집이 있는 위치라면
			{
				dfs(i, j, ++danji_index); //DFS 탐색하기 (1단지부터)
			}
		}
	}

	sort(danji_max + 1, danji_max + danji_index + 1); //오름차순으로 정렬하기

	cout << danji_index << endl;
	if (danji_index != 0)
	{
		for (int i = 1; i <= danji_index; i++)
			cout << danji_max[i] << endl;
	}
}

> 각 코드에 대한 설명을 주석으로 달아놨습니다.

'Problem Solving > 백준' 카테고리의 다른 글

[백준] 2579번 : 계단 오르기  (0) 2020.06.24
[백준] 2875번 : 대회 or 인턴  (0) 2020.06.23
[백준] 1654번 : 랜선 자르기  (0) 2020.06.19
[백준] 2512번 : 예산  (0) 2020.06.17
[백준] 5575번 : 타임카드  (0) 2020.04.05