문제 : 백준 10026 적록색약 🍎
난이도 : 골드 5
1️⃣ 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다.
2️⃣ N x N인 그리드의 각 칸은 R(빨강), G(초록), B(파랑) 중 하나로 색칠되어 있다.
3️⃣ 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다.
4️⃣ 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다.
이 문제의 핵심은 같은 색상이 상하좌우로 인접해 있는 경우, 같은 구역에 속한다는 것이다!
- 상하좌우를 살펴보면서 자신의 색상과 동일하다면, 해당 색상을 방문하고 이를 dfs로 탐색한다.
for(int i=0; i<N; i++){
cin>>a;
for(int j=0; j<N; j++){
if(a[j]=='R'){
arrRGB[i][j] = 1;
arrGB[i][j] = 1;
}
else if(a[j]=='B'){
arrRGB[i][j] = 2;
arrGB[i][j] = 2;
}
else {
arrRGB[i][j] = 3;
arrGB[i][j] = 1;
}
}
}
void dfs(int x, int y, int color){
arrRGB[x][y] = 0; //방문한 경우
if(y-1 >= 0 and arrRGB[x][y-1] == color) dfs(x, y-1, color); //상
if(y+1 < N and arrRGB[x][y+1] == color) dfs(x, y+1, color); //하
if(x+1 < N and arrRGB[x+1][y] == color) dfs(x+1, y, color); //우
if(x-1 >= 0 and arrRGB[x-1][y] == color) dfs(x-1, y,color); //좌
}
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(arrRGB[i][j] != 0) {
dfs(i,j,arrRGB[i][j]);
areaRGB +=1;
}
if(arrGB[i][j] != 0){
dfs2(i,j,arrGB[i][j]);
areaRG += 1;
}
}
}
#include <iostream>
using namespace std;
int N = 0;
int arrRGB[100][100]; //빨간색이 있는 구역 = 1, 파랜색이 있는 구역 = 2, 초록색이 있는 구역 = 3
int arrGB[100][100];
int areaRGB = 0; //적록색약이 아닌 사람이 보는 구역의 수
int areaRG = 0; //적록색약인 사람이 보는 구역의 수
void dfs(int x, int y, int color){
arrRGB[x][y] = 0;
if(y-1 >= 0 and arrRGB[x][y-1] == color) dfs(x, y-1, color);
if(y+1 < N and arrRGB[x][y+1] == color) dfs(x, y+1, color);
if(x+1 < N and arrRGB[x+1][y] == color) dfs(x+1, y, color);
if(x-1 >= 0 and arrRGB[x-1][y] == color) dfs(x-1, y,color);
}
void dfs2(int x, int y, int color){
arrGB[x][y] = 0;
if(y-1 >= 0 and arrGB[x][y-1] == color) dfs2(x, y-1, color);
if(y+1 < N and arrGB[x][y+1] == color) dfs2(x, y+1, color);
if(x+1 < N and arrGB[x+1][y] == color) dfs2(x+1, y, color);
if(x-1 >= 0 and arrGB[x-1][y] == color) dfs2(x-1, y,color);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin>>N;
string a;
for(int i=0; i<N; i++){
cin>>a;
for(int j=0; j<N; j++){
if(a[j]=='R'){
arrRGB[i][j] = 1;
arrGB[i][j] = 1;
}
else if(a[j]=='B'){
arrRGB[i][j] = 2;
arrGB[i][j] = 2;
}
else {
arrRGB[i][j] = 3;
arrGB[i][j] = 1;
}
}
}
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(arrRGB[i][j] != 0) {
dfs(i,j,arrRGB[i][j]);
areaRGB +=1;
}
if(arrGB[i][j] != 0){
dfs2(i,j,arrGB[i][j]);
areaRG += 1;
}
}
}
cout<<areaRGB<<" "<<areaRG;
}