알고리즘 풀이/백준

2583번-영역 구하기

claire 2022. 2. 7. 12:07
#include<bits/stdc++.h>
#define X first 
#define Y second
using namespace std;

int board[102][102];
int vis[102][102];
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int m, n, k;	//m은 세로, n은 가로, k는 사각형 개수
	queue<pair<int, int>> Q;
	vector<int> v;
	cin >> m >> n >> k;
	while (k--) {
		int x1, x2, y1, y2;
		cin >> x1 >> y1 >> x2 >> y2;
		for (int i = x1; i < x2; i++) {
			for (int j = y1; j < y2; j++) {
				board[j][i] = 1;
			}
		}
	}
	int cnt = 0;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (board[i][j] == 1 || vis[i][j] > 0) continue;
			Q.push({ i,j });
			vis[i][j] = 1;
			int width = 1;
			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 >= m || ny < 0 || ny >= n)continue;
					if (board[nx][ny]==1||vis[nx][ny]>0)continue;
					Q.push({ nx,ny });
					vis[nx][ny] = 1;
					width++;
				}
			}
			v.push_back(width);
		}
	}
	cout << v.size()<<"\n";
	sort(v.begin(), v.end());
	for(int i=0;i<v.size();i++)cout<<v[i]<<' ';
}

처음엔 따로 width를 주지 않고 vis[nx][ny]에 전의 값을 더해가며 vis[nx][ny]값을 사용하려고 했지만 내가 출력하려는 시점에서는 해당 값이 이미 변해버린 후였다. 아무튼. 큐를 비워가는 과정에서 상하좌우를 조사하는 nx, ny는 블록 밖으로 꺼내올 생각일랑 하지 말어라~

무지하게 헤맸구먼..ㅎㅎ풀이는 일찍 끝냈는데...좀 꼼꼼하게 조건이나 그런걸 생각하자ㅏ...침착하게 작성한 것이 가장 빠른 풀이이다.