
1. idea
- 세로, 가로, 직사각형 개수를 입력받고, 개수 만큼 직사각형의 각 꼭짓점을 입력받는다
- vector를 전부 0으로 채운 다음 이중 for문으로 (꼭지점 시작 x ~ 끝 x), (꼭지점 시작 y ~ 끝 y) 돌면서 1로 변경
- 그다음 map 돌면서 0 만나면 dfs 시작, dfs 내에서 방문은 1로 변경 처리 + 넒이 count, ans vector에 dfs 끝나고 나온 size 값 push_back()
- ans sort(오름차순) 하고 ans size랑 ans 내부 요소들 cout
2 DFS 함수 만들기
int dfs(vector<vector<int>>&map, int x, int y, int ex, int ey){
int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};
map[y][x] = 1;
int cnt = 1;
for(int i =0; i<4; ++i){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < ex && ny >= 0 && ny < ey){
if(!map[ny][nx]) cnt += dfs(map, nx, ny, ex, ey);
}
}
return cnt;
}
3. 전체 지도 순회
vector<int>ans;
for(int i = 0; i < R; ++i){
for(int j = 0; j < C; ++j){
if(!map[i][j]){
int size = dfs(map, j, i, C, R);
ans.push_back(size);
}
}
}
4. 코드 전문
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int dfs(vector<vector<int>>&map, int x, int y, int ex, int ey){
int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};
map[y][x] = 1;
int cnt = 1;
for(int i =0; i<4; ++i){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < ex && ny >= 0 && ny < ey){
if(!map[ny][nx]) cnt += dfs(map, nx, ny, ex, ey);
}
}
return cnt;
}
int main(){
int C, R, X;
cin >> R >> C >> X;
vector<vector<int>>map(R, vector<int>(C,0));
int sx, sy, ex, ey;
while(X--){
cin >> sx >> sy >> ex >> ey;
for(int i = sy; i < ey; ++i){
for(int j = sx; j < ex; ++j){
map[i][j] = 1;
}
}
}
/*for(int i = 0; i < R; ++i){
for(int j = 0; j < C; ++j)cout << map[i][j] << " ";
cout << endl;
}*/ // vector 입력 확인
vector<int>ans;
for(int i = 0; i < R; ++i){
for(int j = 0; j < C; ++j){
if(!map[i][j]){
int size = dfs(map, j, i, C, R);
ans.push_back(size);
}
}
}
sort(ans.begin(), ans.end());
cout << ans.size() << endl;
for(auto x : ans) cout << x << " ";
return 0;
}'C++ 문제풀기 > 백준-프로그래머스' 카테고리의 다른 글
| 백준 | 1260. DFS와 BFS (0) | 2025.06.26 |
|---|---|
| 백준 | 10026. 적녹색약 (0) | 2025.06.25 |
| 백준 | 1012. 유기농 배추 (0) | 2025.06.25 |
| 백준 | 4963. 섬의 개수 (1) | 2025.06.24 |
| 백준 | 2667. 단지번호 붙이기 (3) | 2025.06.24 |