https://www.acmicpc.net/problem/10026
적록색약이 아닌 경우일 때의 BFS
와 적록색약인 경우의 BFS
를 돌리면 된다.
만약, 적록색약일 경우에는 빨간색과 초록색의 차이를 못 느끼기 때문에 필자 같은 경우는 칸이 빨간색이라면 초록색으로 바꾸어서 진행하였다.
코드를 살펴보면 겹치는 부분이 상당수라 이 부분을 따로 함수를 만들어서 하는 것이 보기 더 깔끔하다고 생각한다.
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
string board[102];
bool vist1[102][102];
bool vist2[102][102];
int n;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 0; i < n; i++) {
cin >> board[i];
}
// 적록색약이 아닌 사람을 위한 bfs
int cnt1 = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(vist1[i][j] == true)
continue;
queue<pair<int,int> > Q;
Q.push(make_pair(i,j));
vist1[i][j] = true;
++cnt1;
char ch = board[i][j];
while(!Q.empty()) {
pair<int,int> cur = Q.front();
Q.pop();
for(int dir = 0; dir < 4; dir++) {
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx < 0 || nx >= n || ny < 0 || ny >= n)
continue;
if(board[nx][ny] != ch || vist1[nx][ny])
continue;
Q.push(make_pair(nx,ny));
vist1[nx][ny] = true;
}
}
}
}
// 적록색약인 사람을 위한 bfs
// 빨간색과 초록색을 같게 하기 위해
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(board[i][j] == 'R')
board[i][j] = 'G';
}
}
int cnt2 = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(vist2[i][j] == true)
continue;
queue<pair<int,int> > Q;
Q.push(make_pair(i,j));
vist2[i][j] = true;
++cnt2;
char ch = board[i][j];
while(!Q.empty()) {
pair<int,int> cur = Q.front();
Q.pop();
for(int dir = 0; dir < 4; dir++) {
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx < 0 || nx >= n || ny < 0 || ny >= n)
continue;
if(board[nx][ny] != ch || vist2[nx][ny])
continue;
Q.push(make_pair(nx,ny));
vist2[nx][ny] = true;
}
}
}
}
cout << cnt1 << ' ' << cnt2;
return 0;
}