관리 메뉴

기억을 위한 기록들

[백준 10026: 적록색약] - C++ 본문

Coding Test - cpp/DFS

[백준 10026: 적록색약] - C++

에드윈H 2021. 2. 15. 14:07

www.acmicpc.net/problem/10026

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

#include<iostream>
#include<string>
#include<string.h>
using namespace std;

int n;
char map[101][101];
bool check[101][101];

int dir[4][2] = {
	{-1,0}
	,{0,1}
	,{1,0}
	,{0,-1}
};

void D2(int _x, int _y, char curChar)
{

	for (int i = 0; i < 4; i++)
	{
		int nextX = _x + dir[i][0];
		int nextY = _y + dir[i][1];

		if (nextX < 0 || nextY < 0 || n <= nextX || n <= nextY)
			continue;


		if (!check[nextX][nextY])
		{
			
			if (curChar == 'R'&& (map[nextX][nextY] == 'R' || map[nextX][nextY] == 'G'))
			{
				check[nextX][nextY] = true;
				D2(nextX, nextY,'G');
				D2(nextX, nextY, 'R');
			}
			else if (curChar == 'G'&& (map[nextX][nextY] == 'R' || map[nextX][nextY] == 'G'))
			{				
				check[nextX][nextY] = true;
				D2(nextX, nextY, 'R');
				D2(nextX, nextY, 'G');
			}
			else if (map[nextX][nextY] == curChar)
			{
				check[nextX][nextY] = true;
				D2(nextX, nextY, curChar);
				
			}
		}
	}
}

void D(int _x, int _y,char curChar)
{

	for (int i = 0; i < 4; i++)
	{
		int nextX = _x + dir[i][0];
		int nextY = _y + dir[i][1];

		if (nextX < 0 || nextY < 0 || n <= nextX || n <= nextY)
			continue;
		

		if (map[nextX][nextY]==curChar && !check[nextX][nextY])
		{
			check[nextX][nextY] = true;
			D(nextX, nextY,curChar);			
		}
	}
}

int main() {
	
	cin >> n;

	string input;
	for (int i = 0; i < n; i++)
	{
		cin >> input;
		for (int j = 0; j < n; j++)
		{
			map[i][j] = input[j];
		}
	}
	int cnt = 0;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (check[i][j] == false)
			{
				char curChar = map[i][j];
				check[i][j] = true;
				D(i, j, curChar);
				cnt++;
			}
			
		}
	}

	cout << cnt << " ";

	cnt = 0;
	memset(check, false, sizeof(check));
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (check[i][j] == false)
			{
				char curChar = map[i][j];

				check[i][j] = true;
				D2(i, j, curChar);
				cnt++;
			}

		}
	}

	cout << cnt << endl;
	return 0;
}

'Coding Test - cpp > DFS' 카테고리의 다른 글

[백준 1937: 욕심쟁이 판다] - C++  (0) 2021.02.15
[백준 2573: 빙산] - C++  (0) 2021.02.15
[백준 1987: 알파벳] - C++  (0) 2021.02.15
[백준 2617: 구슬 찾기] - C++  (0) 2021.02.11
[백준 1926: 그림] - C++  (0) 2021.02.10