백준 2583번 영역 구하기

최성현·2021년 2월 13일
0

백준 문제풀이

목록 보기
15/29

문제링크

😊 코드 설명

직사각형으로 채워진곳은 map을 전부 1로 할당하고 0을 돌면서 영역을 카운트하였다. 기본적인 문제였지만 주의하여야 할점은 처음 y,x좌표가 반대로 꼬여있기때문에 문제를 정확히보고 중간중간 디버깅을 통하여 map에 문제모양대로 되어있는지 확인하는 습관이 중요하다.

😊 소스 코드

#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
	int n, m, k;
	int map[101][101];
	bool visit[101][101];
	int dy[] = { -1,1,0,0 };
	int dx[] = { 0,0,1,-1 };
	vector<int> cost; //땅넓이
	int costt; //각각 땅 넓이
void dfs(int y, int x) {

	costt++;
	visit[y][x] = true;
	for (int i = 0; i < 4; i++) {
		
		int ny = y + dy[i];
		int nx = x + dx[i];

		if (ny < 0 || ny >= m || nx < 0 || nx >= n) continue;
		
		
		if(map[ny][nx]==0 && !visit[ny][nx]) 
			dfs(ny, nx);

	}


}

int main() {
	int x1, x2, y1, y2;
	cin >> m >> n >> k;
	
	for (int i = 0; i < k; i++) {
		cin >> x1 >> y1 >> x2 >> y2;
		for (int y = m - y2; y < m-y1; y++) {
			for (int x = x1; x < x2;x++) {
				map[y][x] = 1;
			}
		}
	}
	int landcnt = 0;
	for (int y = 0; y < m; y++) {
		for (int x = 0; x < n; x++) {
			if (map[y][x] == 0 && !visit[y][x]) {
				landcnt++;
				costt = 0;
				dfs(y, x);
				cost.push_back(costt);
			}
		}
	}
	sort(cost.begin(), cost.end());

	cout << landcnt << endl;
	for (int i = 0; i < landcnt; i++) {
		cout << cost[i] << " ";
	}

	return 0;
}
profile
후회없이

0개의 댓글