백준 10026 - 적록색맹 - DFS

Byungwoong An·2021년 5월 27일
0

문제


문제링크 : https://www.acmicpc.net/problem/10026

풀이전략

  1. 기존에 같은 값들만 찾는 DFS를 한개, 적록색맹일때의 값을 찾는 DFS를 한개 만들어 구별하여 해결한다.
  2. 체크배열을 따로 만들어 기존에 주어진 input에 값을 바꾸지 않도록 한다.

코드

#include<bits/stdc++.h>

using namespace std;

int N;
char a[102][102];
//체크배열
bool ch[102][102];
// 가로세로 이동을 위한 배열
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};
int normalCnt = 0, oddCnt = 0;
// 일반적인 사람의 DFS
void nomalPeople(int r, int c, char color){

    for(int i=0; i<4; i++){
        int rr = r+dy[i];
        int cc = c+dx[i];
        if(a[rr][cc] == color && ch[rr][cc] == false){
            ch[rr][cc] = true;
            nomalPeople(rr, cc, color);
        }
    }
}
//  적록색맹의 DFS
void oddPeople(int r, int c, char color){
    if(color == 'B'){
            for(int i=0; i<4; i++){
                int rr = r+dy[i];
                int cc = c+dx[i];
                if(a[rr][cc] == color && ch[rr][cc] == false){
                    ch[rr][cc] = true;
                    oddPeople(rr, cc, color);
            }
        }
    }
    else{
        for(int i=0; i<4; i++){
                int rr = r+dy[i];
                int cc = c+dx[i];
                if((a[rr][cc] == 'R' || a[rr][cc] == 'G') && ch[rr][cc] == false){
                    ch[rr][cc] = true;
                    oddPeople(rr, cc, color);
                }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    // freopen("../input.txt","rt",stdin);
    cin >> N;
    // 이미 처리한 문자는 #으로 바꾸기
    

    for(int i=1; i<=N; i++){
        for(int j=1; j<=N; j++){
            cin >> a[i][j];
        }
    }
    memset(ch, false, sizeof(ch));
    for(int i=1; i<=N; i++){
        for(int j=1; j<=N; j++){
            if(ch[i][j] == false){
                ch[i][j] = true;
                nomalPeople(i, j, a[i][j]);
                normalCnt++;
            }
        }
    }
    memset(ch, false, sizeof(ch));
    for(int i=1; i<=N; i++){
        for(int j=1; j<=N; j++){
            if(ch[i][j] == false){
                ch[i][j] = true;
                oddPeople(i, j, a[i][j]);
                oddCnt++;
            }
        }
    }
    cout << normalCnt << " " << oddCnt << '\n';
    return 0;
}


소감

적록색맹의 경우 parameter에 color를 주어 B일때 그리고 B가 아닐때 두가지 경우에 맞추어 코드를 만들었다. 다른분들은 BFS로 한번에 처리하셨다... 나도 BFS도 공부해야겠다.

profile
No Pain No Gain

0개의 댓글

관련 채용 정보