백준 10026(적록색약)

jh Seo·2022년 11월 13일
0

백준

목록 보기
76/194
post-custom-banner

개요

백준 10026: 적록 색약

  • 입력
    첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)

    둘째 줄부터 N개 줄에는 그림이 주어진다.

  • 출력
    적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.

접근방법

  1. DFS방법을 이용하여 풀이했다.
    DFS함수의 첫번째 두번째 인자는 좌표, 세번째인자는 타겟 색깔로 잡았다.

  2. DFS함수를 두개를 짜서 하나는 G,B를 똑같이 인식하고, 나머지 하나는
    세 색깔 모두 다르게 인식하도록 짰다.

코드

#include<iostream>

using namespace std;
int N=0;
char RGB[101][101];
int visited[101][101];
int dx[4] = { 0,0,-1,1 };
int dy[4] = { -1,1,0,0 };

void input() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> RGB[i][j];
		}
	}
}

//적녹색약일때
void dfsRB(int x, int y,char RB) {
	//방문했다면 return
	if (visited[x][y]) return;
	visited[x][y] = true;
	for (int i = 0; i < 4; i++) {
		int nextA = x + dx[i];
		int nextB = y + dy[i];
		//타겟 색이 G나 R이면 동일하게 인식
		if (RB == 'G' || RB == 'R') {
			//범위 바깥이 아니면서 nextA,nextB좌표의 색이 R이나 G라면
			if (nextA >= 0 && nextB >= 0 && nextA < N && nextB < N && (RGB[nextA][nextB] == 'R' ||RGB[nextA][nextB]=='G') ) {
				//방문하지 않았따면
				if (!visited[nextA][nextB])
					//DFSRB를 실행
				dfsRB(nextA, nextB, RB);
			}
		}
		//파란색이라면
		else 
			//범위 바깥이 아니면서 nextA,nextB좌표의색이 파랑이라면
			if (nextA >= 0 && nextB >= 0 && nextA < N && nextB < N && RGB[nextA][nextB] == 'B' ) {
				//방문 안했다면
				if(!visited[nextA][nextB])
					//dfs함수 실행
				dfsRB(nextA, nextB, RB);
			}

	}
}
//색약 아닐때
void dfsRGB(int x, int y,char R) {
	//방문했다면 return
	if (visited[x][y]) return;
	visited[x][y] = true;
	for (int i = 0; i < 4; i++) {
		int nextA = x + dx[i];
		int nextB = y + dy[i];
		//범위 바깥이 아니면서, 다음 색이 이번에 매개변수로 들어온 색과 같다면
		if (nextA >= 0 && nextB >= 0 && nextA < N && nextB < N && RGB[nextA][nextB]==R) {
			//방문 안했다면
			if (!visited[nextA][nextB])
				dfsRGB(nextA, nextB, R);
		}

	}
}


void solution() {
	//정상인의 컴퍼넌트 수와, 적녹색약 컴퍼넌트 수
	int RGBcomponent = 0,RBcomponent=0;
	// 방문배열 초기화
	fill(&visited[0][0], &visited[100][100], false);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (!visited[i][j]) {
				RGBcomponent++;
				dfsRGB(i, j, RGB[i][j]);
			}
		}
	}
	//방문배열 다시 초기화
	fill(&visited[0][0], &visited[100][100], false);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (!visited[i][j]) {

				RBcomponent++;
				dfsRB(i, j, RGB[i][j]);
			}
		}
	}
	cout << RGBcomponent <<" "<<RBcomponent;
}

int main() {
	input();
	solution();
}

문풀후생

여러가지 실수들을 한 문제인데,
dfs함수 안에 if(!visit[][]) 조건을 빼서 다시 탐색하게 한 실수,
색 알파벳이 'G'인데 'g'라고 한 실수,
계속 RGB함수의 컴퍼넌트가 RB의 컴퍼넌트와 비슷하게 나와서 헤맸는 데,
알고보니 RGB함수 안에 재귀함수를 RB함수로 적어서 그런거 였다..

profile
코딩 창고!
post-custom-banner

0개의 댓글