중요 지식
DFS - 인접한 주택을 탐색하기 위함
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int map[25][25];
int N;
void DFS(int x, int y, int &num){
int xl[4] = {1, 0, -1, 0};
int yl[4] = {0, 1, 0, -1};
int xi, yi;
map[x][y] = 0;
num++;
for(int i = 0; i < 4; i++){
xi = x + xl[i];
yi = y + yl[i];
if((xi >= 0 && xi < N) && (yi >= 0 && yi < N) && map[xi][yi] == 1) {
DFS(xi, yi, num);
}
}
}
int main(){
vector<int> numbers;
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){
int num = 0;
DFS(i, j, num);
numbers.push_back(num);
}
}
}
sort(numbers.begin(), numbers.end());
printf("%d\n", numbers.size());
for(const int& num : numbers){
printf("%d\n", num);
}
return 0;
}
풀이
1. 2차원배열 map에 주택의 정보를 저장하고,
2-1. map을 하나하나 검사하는데 주택이 나온다면 상하좌우 인접주택을 검사하는 DFS함수를 실행한다
2-2. DFS함수는 인접 주택을 방문할 때마다 num에 +1을 하고 방문한 주택은 0으로 설정한다
2-3. 구해진 num은 vector인 numbers에 저장
3. numbers를 정렬한 뒤 사이즈와 요소를 출력한다
질문1) DFS함수의 인자중 int &num의 정체는?
DFS함수를 통해서 주택수를 구해야 하지만 이미 재귀함수로써 사용되고 있어서 반환값으로 설정하기 보다는 래퍼런스(&)를 이용하여 직접 값을 참조해서 올려주는게 쉽고 간편하다고 생각했습니다
'프로그래밍 문제집 > 백준' 카테고리의 다른 글
[KOI 2020 1차대회 중등부] 19941번-햄버거 분배 (0) | 2022.02.24 |
---|---|
[KOI 2019 1차대회 초등부] 17608번-막대기 (0) | 2022.02.24 |
1676번-팩토리얼 (미완성) (0) | 2022.02.14 |
7662번-이중 우선순위 큐 (0) | 2022.02.12 |
1927번-최소 힙 (0) | 2022.02.11 |