본문 바로가기

ALG/ALG Solve

C++) 백준 10026번 - 적록색약

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