[BOJ]10026 - 적록색약

yoon_H·2022년 6월 24일

BOJ

목록 보기
28/110

10026

#include <iostream>
#define MAX 101
using namespace std;

int n, check[MAX][MAX];

string area[MAX];

int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,1,-1 };


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


		if (nx <0 || nx >=n || ny < 0 || ny >= n) continue;
		if (check[nx][ny] == 0 && area[nx][ny] == area[x][y]) {
			check[nx][ny] = 1;
			dfs(nx, ny);
		}
	}
}

int main() {

	cin >> n;

	for (int i = 0; i < n; i++)
	{
		cin >> area[i];
	}

	int cnt = 0;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (check[i][j] == 0)
			{
				cnt++;
				check[i][j] =1;
				dfs(i, j);
			}
		}
	}

	cout << cnt << " ";

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
		{
			if (area[i][j] == 'G')area[i][j] = 'R';
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
			check[i][j] = 0;
	}

	cnt = 0;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (check[i][j] == 0)
			{
				cnt++;
				check[i][j] = 1;
				dfs(i, j);
			}
		}
	}

	cout << cnt;


	return 0;

}

저번 미로찾기에서 너무 코드를 낭비한 것 같아서 좋은 방법이 있는지 찾아봤는데

dx, dy로 상하좌우를 쉽게 검색하는 방법이 있었다.

저번에 2667번인 단지번호 붙이기를 보고 못 풀었는데 이 문제와 같은 형태인 것 같다.

다음에는 이 코드를 바탕으로 다시 풀어보기!

참고자료


10026 c++ 솔루션

0개의 댓글