HyeLog

๋ฐฑ์ค€_2234_์„ฑ๊ณฝ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑ์ค€_2234_์„ฑ๊ณฝ

shj718 2022. 7. 8. 20:45

๐Ÿ™‹‍โ™€๏ธ ๋ฌธ์ œ

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

 

2234๋ฒˆ: ์„ฑ๊ณฝ

์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ N, M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๋กœ ๋ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ํ•œ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง€๋Š”๋ฐ, ์„œ์ชฝ์— ๋ฒฝ์ด ์žˆ์„ ๋•Œ๋Š” 1์„, ๋ถ์ชฝ์— ๋ฒฝ์ด ์žˆ์„ ๋•Œ๋Š” 2๋ฅผ,

www.acmicpc.net

 

๐Ÿงฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜

BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๐Ÿ’ก ์•„์ด๋””์–ด

์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๊ฐ ์นธ์˜ ์ˆซ์ž๋ฅผ 1<<n (์ด๋•Œ n์€ 0~3) ๊ณผ AND ์—ฐ์‚ฐํ•˜๋ฉด ๋ฒฝ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์—ญ์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด(๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Œ), ๊ตฌ์—ญ ๋„“์ด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

  1. ์ด ์„ฑ์— ์žˆ๋Š” ๋ฐฉ์˜ ๊ฐœ์ˆ˜
  2. ๊ฐ€์žฅ ๋„“์€ ๋ฐฉ์˜ ๋„“์ด
  3. ํ•˜๋‚˜์˜ ๋ฒฝ์„ ์ œ๊ฑฐํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋„“์€ ๋ฐฉ์˜ ํฌ๊ธฐ

BFS ํ•œ๋ฒˆ์œผ๋กœ ์œ„ 3๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๐Ÿ‘ฉ‍๐Ÿ’ป ์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;

int n, m;
int a[50][50];
int area[50][50]; // ๊ตฌ์—ญ ๋ฒˆํ˜ธ (๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋„ ๊ฒ€์‚ฌ ๊ฐ€๋Šฅ)
int areaSize[50 * 50 + 1]; // ๊ตฌ์—ญ ๋„“์ด
int dx[4] = { 0,-1,0,1 }; // ์„œ,๋ถ,๋™,๋‚จ ๋ฐฉํ–ฅ
int dy[4] = { -1,0,1,0 };

int bfs(int i, int j, int areaNum) {
	queue<pair<int, int>> q;
	q.push(make_pair(i, j));
	area[i][j] = areaNum;
	int cnt = 0; // ๋ฐฉ๋ฌธํ•œ ์ •์  ๊ฐœ์ˆ˜ (๊ตฌ์—ญ ๋„“์ด ๊ณ„์‚ฐ)
	while (!q.empty()) {
		int x = q.front().first;
		int y = q.front().second;
		q.pop();
		cnt += 1;
		for (int k = 0; k < 4; k++) {
			int nx = x + dx[k];
			int ny = y + dy[k];
			if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; // ๋ฒ”์œ„ ๊ฒ€์‚ฌ
			if (area[nx][ny] != 0) continue; // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ
			if (a[x][y] & (1 << k)) continue; // ๋ฒฝ ๊ฒ€์‚ฌ
			q.push(make_pair(nx, ny));
			area[nx][ny] = areaNum;
		}
	}
	return cnt;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	// input
	cin >> m >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
		}
	}
	// ๊ตฌ์—ญ ๊ฐœ์ˆ˜
	int areaNum = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (area[i][j] == 0) { // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
				areaNum += 1;
				areaSize[areaNum] = bfs(i, j, areaNum);
			}
		}
	}
	cout << areaNum << '\n';
	// ๊ฐ€์žฅ ๋„“์€ ๋ฐฉ์˜ ๋„“์ด
	int maxSize = 0;
	for (int i = 1; i <= areaNum; i++) {
		if (maxSize < areaSize[i]) {
			maxSize = areaSize[i];
		}
	}
	cout << maxSize << '\n';
	// ํ•˜๋‚˜์˜ ๋ฒฝ์„ ์ œ๊ฑฐํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋„“์€ ๋ฐฉ์˜ ํฌ๊ธฐ
	int newMaxSize = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			int x = i;
			int y = j;
			for (int k = 0; k < 4; k++) {
				int nx = x + dx[k];
				int ny = y + dy[k];
				if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
				if (area[nx][ny] == area[x][y]) continue; // ๊ฐ™์€ ๊ตฌ์—ญ์ด๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
				if (a[x][y] & (1 << k)) {
					if (newMaxSize < areaSize[area[x][y]] + areaSize[area[nx][ny]]) {
						newMaxSize = areaSize[area[x][y]] + areaSize[area[nx][ny]];
					}
				}
			}
		}
	}
	cout << newMaxSize << '\n';
	return 0;
}