📝 문제

💻 실행 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};
int n;
int map[26][26];
int house;
vector<int> v;
void DFS(int i, int j);
int main() {
cin >> n;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
scanf("%1d", &map[i][j]);
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(map[i][j] == 1){
house = 0;
DFS(i, j);
v.push_back(house);
}
}
}
sort(v.begin(), v.end());
cout << v.size() << "\n";
for(int i = 0; i < v.size(); i++)
cout << v[i] << "\n";
}
void DFS(int i, int j){
map[i][j] = 0;
house++;
for(int k = 0; k < 4; k++){
if(i + dy[k] < 0 || i + dy[k] >= n || j + dx[k] < 0 || j + dx[k] >= n)
continue;
if(map[i + dy[k]][j + dx[k]] == 1)
DFS(i + dy[k], j + dx[k]);
}
}
📚 문제 풀이
- DFS로 문제 해결
- 먼저 숫자를 하나씩 입력받아 배열에 저장하기 위해 scanf를 사용
- 만약
map[i][j]
가 1이라면 집이라는 뜻으로 house 변수를 0으로 초기화하고 DFS 함수를 호출. 그 이후 DFS 함수가 끝난 이후의 house 변수를 벡터에 push
- DFS 함수에서는
map[i][j]
의 상하좌우를 살피고 값이 1이라면 house 변수 증가시키고 재귀 호출해 다시 탐색
- 탐색이 끝났다면 벡터를 정렬하고, 벡터 원소 개수와 원소를 오름차순으로 출력
✅ 실행결과
