https://www.acmicpc.net/problem/2667
<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 |