코딩테스트 문제풀이/백준

[백준][DFS] 적록색약

itaeiou 2020. 3. 1. 20:42
반응형

백준 알고리즘

DFS

C++

 

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

 

10026번: 적록색약

문제 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은

www.acmicpc.net

 

#include <iostream>
#include <algorithm>
using namespace std;

int T;
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,-1,0,1 };
char map[101][101];
int visited[100][100] = { 0, };
int visited_rg[100][100] = { 0, };

void dfs(int x, int y, char c);
void dfs_rg(int x, int y, char c);

int main() {
	int count = 0, count_rg = 0;
	cin >> T;
	for (int i = 0; i < T; i++) {
		cin >> map[i];
	}

	for (int i = 0; i < T; i++) {
		for (int j = 0; j < T; j++) {
			if (visited[i][j] == 0) {
				count++;

				dfs(i, j, map[i][j]);
			}
		}
	}

	for (int i = 0; i < T; i++) {
		for (int j = 0; j < T; j++) {
			if (visited_rg[i][j] == 0) {
				count_rg++;

				dfs_rg(i, j, map[i][j]);
			}
		}
	}

	cout << count << ' ' << count_rg;

	return 0;
}

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

		if (0 <= nx && nx < T && 0 <= ny && ny < T) {
			if (map[nx][ny] == c && visited[nx][ny] == 0) {
				dfs(nx, ny, c);
			}
		}
	}
}

void dfs_rg(int x, int y, char c) {
	visited_rg[x][y] = 1;
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];

		if (0 <= nx && nx < T && 0 <= ny && ny < T) {
			if (visited_rg[nx][ny] == 0) {
				if (c == 'B' && map[nx][ny] == c) {
					dfs_rg(nx, ny, c);
				}
				if (c != 'B' && (map[nx][ny] == 'R' || map[nx][ny] == 'G')) {
					dfs_rg(nx, ny, c);
				}
			}
		}
	}
}
반응형

'코딩테스트 문제풀이 > 백준' 카테고리의 다른 글

[백준] 별 찍기 - 10  (0) 2021.04.06
[백준][BFS] 토마토  (0) 2020.03.01
[백준][DFS] 경로찾기  (0) 2020.03.01