백준/실버

[백준] 실버1-영역 구하기 C++ 2583번

taene_ 2025. 2. 23. 10:53

https://www.acmicpc.net/problem/2583

 

// 범위 잘 생각하기, y1 변수 사용 시 #define 걸기

1. 전역변수 사용한 답

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define y1 aaaa
int M, N, K;
int x1, x2, y1, y2;
int area, cnt;
vector<int> areas;
int dy[] = { -1,1,0,0 };
int dx[] = { 0,0,-1,1 };
bool visited[100][100];
int adj[100][100];

void dfs(int y, int x)
{
	visited[y][x] = 1;

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

		if (ny < 0 || nx < 0 || ny >= M || nx >= N) continue;
		if (adj[ny][nx]) continue;
		if (visited[ny][nx]) continue;

		area++;
		dfs(ny, nx);
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> M >> N >> K;

	for (int i = 0; i < K; i++)
	{
		cin >> x1 >> y1;
		cin >> x2 >> y2;

		for (int i = y1; i < y2; i++)
		{
			for (int j = x1; j < x2; j++)
			{
				adj[i][j] = 1;
			}
		}
	}
	
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (!adj[i][j] && !visited[i][j])
			{
				area = 1;
				dfs(i, j);
				areas.push_back(area);
				cnt++;
			}
		}
	}
	cout << cnt << '\n';
	sort(areas.begin(), areas.end());
	for (int i : areas)
		cout << i << ' ';

	return 0;
}

 

2. 전역변수 안쓰고 dfs 결과값을 활용한 답

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define y1 aaaa
int M, N, K;
int x1, x2, y1, y2;
vector<int> areas;
int dy[] = { -1,1,0,0 };
int dx[] = { 0,0,-1,1 };
bool visited[100][100];
int adj[100][100];

int dfs(int y, int x)
{
	visited[y][x] = 1;
	int ret = 1;

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

		if (ny < 0 || nx < 0 || ny >= M || nx >= N) continue;
		if (adj[ny][nx]) continue;
		if (visited[ny][nx]) continue;

		ret += dfs(ny, nx);
	}
	return ret;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> M >> N >> K;

	for (int i = 0; i < K; i++)
	{
		cin >> x1 >> y1;
		cin >> x2 >> y2;

		for (int i = y1; i < y2; i++)
		{
			for (int j = x1; j < x2; j++)
			{
				adj[i][j] = 1;
			}
		}
	}
	
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (!adj[i][j] && !visited[i][j])
			{
				areas.push_back(dfs(i, j));
			}
		}
	}
	cout << areas.size() << '\n';
	sort(areas.begin(), areas.end());
	for (int i : areas)
		cout << i << ' ';

	return 0;
}