- toc {:toc}
๋ฌธ์
๋๊ธ์ ๊ฐ๊ฒฉ์ด 1์ธ MรN(M,Nโค100)ํฌ๊ธฐ์ ๋ชจ๋์ข ์ด๊ฐ ์๋ค. ์ด ๋ชจ๋์ข ์ด ์์ ๋๊ธ์ ๋ง์ถ์ด K๊ฐ์ ์ง์ฌ๊ฐํ์ ๊ทธ๋ฆด ๋, ์ด๋ค K๊ฐ์ ์ง์ฌ๊ฐํ์ ๋ด๋ถ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ถ๋ถ์ด ๋ช ๊ฐ์ ๋ถ๋ฆฌ๋ ์์ญ์ผ๋ก ๋๋์ด์ง๋ค.
์๋ฅผ ๋ค์ด M=5, N=7 ์ธ ๋ชจ๋์ข ์ด ์์ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ง์ฌ๊ฐํ 3๊ฐ๋ฅผ ๊ทธ๋ ธ๋ค๋ฉด, ๊ทธ ๋๋จธ์ง ์์ญ์ <๊ทธ๋ฆผ 2>์ ๊ฐ์ด 3๊ฐ์ ๋ถ๋ฆฌ๋ ์์ญ์ผ๋ก ๋๋์ด์ง๊ฒ ๋๋ค.

<๊ทธ๋ฆผ 2>์ ๊ฐ์ด ๋ถ๋ฆฌ๋ ์ธ ์์ญ์ ๋์ด๋ ๊ฐ๊ฐ 1, 7, 13์ด ๋๋ค.
M, N๊ณผ K ๊ทธ๋ฆฌ๊ณ K๊ฐ์ ์ง์ฌ๊ฐํ์ ์ขํ๊ฐ ์ฃผ์ด์ง ๋, K๊ฐ์ ์ง์ฌ๊ฐํ ๋ด๋ถ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ถ๋ถ์ด ๋ช ๊ฐ์ ๋ถ๋ฆฌ๋ ์์ญ์ผ๋ก ๋๋์ด์ง๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ ์์ญ์ ๋์ด๊ฐ ์ผ๋ง์ธ์ง๋ฅผ ๊ตฌํ์ฌ ์ด๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ M๊ณผ N, ๊ทธ๋ฆฌ๊ณ K๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. M, N, K๋ ๋ชจ๋ 100 ์ดํ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ K๊ฐ์ ์ค์๋ ํ ์ค์ ํ๋์ฉ ์ง์ฌ๊ฐํ์ ์ผ์ชฝ ์๋ ๊ผญ์ง์ ์ x, y์ขํ๊ฐ๊ณผ ์ค๋ฅธ์ชฝ ์ ๊ผญ์ง์ ์ x, y์ขํ๊ฐ์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ๋ชจ๋์ข ์ด์ ์ผ์ชฝ ์๋ ๊ผญ์ง์ ์ ์ขํ๋ (0,0)์ด๊ณ , ์ค๋ฅธ์ชฝ ์ ๊ผญ์ง์ ์ ์ขํ๋(N,M)์ด๋ค. ์ ๋ ฅ๋๋ K๊ฐ์ ์ง์ฌ๊ฐํ๋ค์ด ๋ชจ๋์ข ์ด ์ ์ฒด๋ฅผ ์ฑ์ฐ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ถ๋ฆฌ๋์ด ๋๋์ด์ง๋ ์์ญ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋์งธ ์ค์๋ ๊ฐ ์์ญ์ ๋์ด๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ถ๋ ฅํ๋ค.
์ถ์ฒ:https://www.acmicpc.net/problem/2583
ํ์ด
- board์ ๋ํ ์ขํ ์ค์ , ์ง์ฌ๊ฐํ ์๊ทธ๋ฆฌ๊ธฐ
- 2์ฐจ์ ๋ฐฐ์ด์ ๋ํ ์ธ๋ฑ์ค ์ค์ ์ฃผ์ํ๊ธฐ(ํ๋๋ก ํต์ผ)
- STL์ฌ์ฉ์ ์ต์ํด์ง๊ธฐ
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int board[105][105];
int dx[4] = {0, -1, 0, 1};
int dy[4] = {-1, 0, 1, 0};
int x, y, k;
queue<pair<int, int>> q;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> y >> x >> k;
pair<int, int> Left, Right;
while(k--){
cin >> Left.X >> Left.Y >> Right.X >> Right.Y;
for(int i=y-Right.Y; i<y-Left.Y; i++){
for(int j=Left.X; j<Right.X; j++){
board[i][j] = -1;
}
}
}
// ์ง์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ ํ์ธ
/*
for(int i=0; i< y; i++){
for(int j=0; j< x; j++){
cout << board[i][j] << '\t';
}
cout << endl;
}
*/
int cArray[105];
int index = 0;
int area = 0;
for(int i=0; i < y; i++){
for(int j=0; j < x; j++){
int cnt = 0;
if(board[i][j] == 0){
q.push({j, i});
board[i][j] = 1;
area++;
cnt++;
}
while(!q.empty()){
auto cur = q.front(); q.pop();
for(int dir=0; dir < 4; dir++){
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx < 0 || nx >= x || ny < 0 || ny >= y) continue;
if(board[ny][nx] >= 1 || board[ny][nx] == -1) continue;
board[ny][nx] = board[cur.Y][cur.X] + 1;
q.push({nx, ny});
cnt++;
}
if(q.empty() && cnt != 0){
cArray[index] = cnt;
index++;
}
}
}
}
/*
for(int i=0; i< y; i++){
for(int j=0; j< x; j++){
cout << board[i][j] << '\t';
}
cout << endl;
}
*/
///*
sort(cArray, cArray+index); // sort ํจ์ ์ตํ๊ธฐ
cout << area << endl;
for(int i = 0; i < index; i++){
cout << cArray[i] << ' ';
}
//*/
}