https://www.acmicpc.net/problem/10026
10026번: 적록색약
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)
www.acmicpc.net
BFS문제이다.
문자열을 받는다는 점에서 조금 까다로운 면이 있었다.
R,G,B,RG각각 BFS를 수행하는 함수를 만들었다.
R,G,B 함수를 먼저 실행해 R,G값을 1로 변경한 후 RG함수를 실행한다.
#include <bits/stdc++.h>
using namespace std;
string s[102];
void R(int a, int b, int c, int d){ //a,b는 입력된 행과 열, c,d는 행과 열의 최댓값(범위)
if(a<0||a>=c||b<0||b>=d) return; //잘못된 인덱스 접근 방지
if(s[a][b]!='R') return;
s[a][b]=1; //RB함수에서의 string입력의 재활용 위해 1로 값 변경
R(a+1,b,c,d); R(a,b+1,c,d); R(a-1,b,c,d); R(a,b-1,c,d);
}
void G(int a, int b, int c, int d){
if(a<0||a>=c||b<0||b>=d) return;
if(s[a][b]!='G') return;
s[a][b]=1; //RB함수에서의 string입력의 재활용 위해 1로 값 변경
G(a+1,b,c,d); G(a,b+1,c,d); G(a-1,b,c,d); G(a,b-1,c,d);
}
void B(int a, int b, int c, int d){
if(a<0||a>=c||b<0||b>=d) return;
if(s[a][b]!='B') return;
s[a][b]=0;
B(a+1,b,c,d); B(a,b+1,c,d); B(a-1,b,c,d); B(a,b-1,c,d);
}
void RG(int a, int b, int c, int d){ //string 배열에서 값이 1인 원소는 R,G
if(a<0||a>=c||b<0||b>=d) return;
if(s[a][b]!=1) return;
s[a][b]=0;
RG(a+1,b,c,d); RG(a,b+1,c,d); RG(a-1,b,c,d); RG(a,b-1,c,d);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>s[i];
}
int m=s[0].length();
int r=0,g=0,b=0,rg=0;
for(int i=0;i<n;i++){ //R,G,B 먼저 처리해야 RG처리 가능
for(int j=0;j<s[0].length();j++){
if(s[i][j]=='R'){R(i,j,n,m); r++;}
if(s[i][j]=='G'){G(i,j,n,m); g++;}
if(s[i][j]=='B'){B(i,j,n,m); b++;}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<s[0].length();j++){
if(s[i][j]==1){RG(i,j,n,m); rg++;}
}
}
cout<<r+g+b<<" "<<rg+b;
return 0;
}
다시 보니 코드가 가독성이 떨어지는 것 같기도...
'ALG > ALG Solve' 카테고리의 다른 글
C++) 백준 7562번 - 나이트의 이동 (0) | 2023.01.23 |
---|---|
C++) 백준 7569번 - 토마토 (0) | 2023.01.23 |
C++) 백준 1012번 - 유기농 배추 (0) | 2023.01.20 |
C++) 백준 4179번 - 불! (0) | 2023.01.20 |
C++) 백준 1697번 - 숨바꼭질 (0) | 2023.01.20 |