PS

[C++] 10026 : 적록색약

왕방토 2021. 2. 3. 17:53
728x90

골드 Ⅴ

 

 

#include <iostream>
#include <string>

using namespace std;

int n;
int cnt1 = 0;
int cnt2 = 0;
char map[100][100];
int check[100][100] = { 0, };

void dfs(int a, int b) {

	if (check[a][b] || a < 0 || a >= n || b < 0 || b >= n) return;

	check[a][b] = 1;

	if (map[a][b] == map[a - 1][b]) dfs(a - 1, b);
	if (map[a][b] == map[a + 1][b]) dfs(a + 1, b);
	if (map[a][b] == map[a][b - 1]) dfs(a, b - 1);
	if (map[a][b] == map[a][b + 1]) dfs(a, b + 1);

}

int main() {
	scanf("%d", &n);

	string s;
	for (int i = 0; i < n; i++) {
		cin >> s;
		for (int j = 0; j < s.length(); j++) 
			map[i][j] = s.at(j);
	}
	
	//일반사람
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (!check[i][j]) {
				dfs(i, j);
				cnt1++;
			}
		}
	}

	//적록색약을 위해 check 비워주고 map 적록색약의 눈으로 바꿔주기
	for (int i = 0; i < n; i++) 
		for (int j = 0; j < n; j++) 
			check[i][j] = 0;
	for (int i = 0; i < n; i++) 
		for (int j = 0; j < n; j++) 
			if (map[i][j] == 'R') map[i][j] = 'G';

	//적록색약
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (!check[i][j]) {
				dfs(i, j);
				cnt2++;
			}
		}
	}

	printf("%d %d", cnt1, cnt2);
}

 

DFS 이용 (물론 BFS도 됨)

 

처음에는 적록색약을 위한 map도 따로 만들고 (R이 G인 맵)

적록색약을 위한 map도 따로 만들었었는데(map2에서 작동하는 함수)

(이거 만들면서 dfs를 하나로 하고 이차원 배열을 넘겨줄까? 했는데 이차원 배열 넘겨주는 법을 몰라서 그냥 넘겼다

이차원 배열 함수에 인자로 전달하는 방법도 알아야 할 듯)

 

암튼 그랬는데 다 필요 없고 그냥 적록색약에서 구간 셀 때

기존의 map을 적록색약의 시선을 바꿔주면 해결된다

 

내가 되도록 기존 데이터를 안 건드리려고 (나중에 쓸 일이 있으니까) 하는

습관이 있어서 기존 데이터를 바꿀 생각을 못 했는데

 

나중에 큰 프로젝트 진행하면 모를까 그냥 백준 풀 때는 이렇게

기존 데이터를 수정해서 푸는것도 나쁘지는 않을 듯..

 

그나저나 이게 왜 골드 5?

물골드~