문제 분석
기본 BFS 문제와 기본 틀은 같다. 영역의 크기와 분리된 영역의 개수를 BFS 를 통해서 구하면 된다.
해결 방법
칠한 부분을 "벽"이라고 가정한 후 나머지 영역에서 BFS를 적용하면 된다.
주어지는 좌표 값이 왼쪽 모서리의 좌표와 오른쪽 모서리의 좌표가 주어지는데, 이를 2차원 배열에 행 열로 넣으면 그림이 거꾸로 나온다. 하지만 영역의 크기를 계산하면 되는 문제이기 때문에 상관없다.
영역의 크기를 "오름차순"으로 정렬하여 출력하라는 조건이 주어졌기 때문에 Sort 함수를 사용하였다.
코드
#include <iostream>
#include <queue>
#include <utility>
#include <vector>
#include <algorithm>
using namespace std;
#define X first
#define Y second
int board[101][101];
int vis[101][101];
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n,m,k;
int lx,ly,rx,ry;
int area=0, sum=0;
vector<int> vec;
queue<pair<int,int>> q;
cin >> n >> m >> k;
while(k--) {
cin >> lx >> ly >> rx >> ry;
for(int i = ly ; i < ry ; i++) {
for(int j = lx ; j < rx ; j++) {
board[i][j] = -1;
}
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(board[i][j] == -1 || vis[i][j] == 1) continue;
q.push({i,j});
vis[i][j] = 1;
area++;
while(!q.empty()) {
pair<int,int> cur = q.front();
q.pop();
sum++;
for(int dir=0;dir<4;dir++) {
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx<0||nx>=n||ny<0||ny>=m) continue;
if(vis[nx][ny] == 1 || board[nx][ny] == -1) continue;
q.push({nx,ny});
vis[nx][ny] = 1;
}
}
vec.push_back(sum);
sum=0;
}
}
sort(vec.begin(), vec.end());
cout << area << "\n";
for(auto e : vec)
cout << e << " ";
}
- sort
필요한 헤더파일은 <algorithm> 이다.
vector<int> vec;
sort(vec.begin(), vec.end());
첫 번째 인자로는 정렬하고자 하는 리스트의 시작점이, 두 번째 인자로는 리스트의 끝점이 들어간다.
세 번째 인자는 Compare 방식이 들어가야 한다. 위의 코드에서는 세 번째 인자가 생략되어 있는데, 이는 선택사항이며 기본 값은 "오름차순" 이다.
bool compare(int i, int j) {
return j < i;
}
sort(vec.begin(), vec.end(), compare);
"내림차순"으로 정렬하고자 한다면, 직접 compare 함수를 구현하여 인자로 넘겨주면 된다.
이보다 더 간편하게 구현하는 방식은 아래와 같이 greater<>() 임시객체를 콜 하는 방식이다.
sort(vec.begin(), vec.end(), greater<>())
참고 링크
- Sort 함수
'BOJ > BFS' 카테고리의 다른 글
[C++] BOJ 5427 / BFS (불 따로 사람 따로) (0) | 2021.07.22 |
---|---|
[C++] BOJ 2667 / BFS (문자열 파싱 접근) (0) | 2021.07.21 |
[C++] BOJ 7569 / BFS (3차원 배열, tuple 사용) (0) | 2021.07.20 |
[C++] BOJ 1697 / BFS (fill, range based for 사용) (0) | 2021.07.19 |
[C++] BOJ 7576 / BFS 응용(시작점이 여러 개) (0) | 2021.07.19 |