문제풀이(Problem Solving)

백준, BOJ, 10026번, 적록색약 : C++ [CPP]

게임이 더 좋아 2021. 11. 27. 16:21
반응형
728x170

어렵지 않았지만 입력이 귀찮았다.

 

 

https://www.acmicpc.net/problem/10026

 

 

 


#맞는 풀이

#include <iostream>
#include <string>
#include <queue>


#define X first
#define Y second
#define SIZE 100

using namespace std;

int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};

int rg[SIZE][SIZE]; //적녹 색약 visit
int norm[SIZE][SIZE]; // 보통 visit

int n; // 행,열
int normCnt, rgCnt; // 답


string arr[SIZE]; //입력

int main(){
    cin >> n;    
    //노드입력
    for(int i = 0; i<n; i++){
        cin >> arr[i];
    }
    
    queue <pair<int,int>> q;
    
    //보통
    for(int i = 0; i<n; i++){
        for(int j = 0; j<n; j++){
            if(norm[i][j] != 0)continue; //방문했으면 다음노드
            char stand = arr[i][j]; //해당 색 저장
            normCnt++; //해당 노드에 대한 구분영역  + 1
            norm[i][j] = 1; //방문
            q.push({i,j}); //해당 위치 푸시
            //해당 영역 탐색
            while(!q.empty()){
                auto 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(arr[nx][ny] != stand || norm[nx][ny] != 0)continue;
                    
                    q.push({nx,ny});
                    norm[nx][ny] = 1;
                }
            }
            
            
        }
    }
    
    
    //적녹
        for(int i = 0; i<n; i++){
            for(int j = 0; j<n; j++){
                bool rgCheck = false;
                if(rg[i][j] != 0)continue; //방문했으면 다음노드
                char stand = arr[i][j]; //해당 색 저장
                if(stand == 'R' || stand == 'G'){
                    rgCheck = true;
                }
                rgCnt++; //해당 노드에 대한 구분영역  + 1
                rg[i][j] = 1; //방문
                q.push({i,j}); //해당 위치 푸시
                //해당 영역 탐색
                while(!q.empty()){
                    auto 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(rg[nx][ny] != 0)continue;
                        //현재 r,g를 조사하고 있다면
                        if(rgCheck){
                            //B는 방문을 하면 안되고 방문을 했던 노드도 방문하면 안됨.
                            if(arr[nx][ny] == 'B')continue;
                            q.push({nx,ny});
                            rg[nx][ny] = 1;
                        }
                        //현재 r,g를 조사하지 않는다면 -> B라면 
                        //B만 조사
                        else{
                            //B가 아닌 노드에 방문을 하면 안됨
                            if(arr[nx][ny] != stand)continue;
                            q.push({nx,ny});
                            rg[nx][ny] = 1;
                        }                    
                    }
                }
        }
    }
    
    
    
    
    //답
    
    cout <<normCnt <<" " << rgCnt;
    return 0;
}

 

 

까다로운것은 R,G를 같이 봐야한다는 것?

그것만 예외처리 해주면 된다.

728x90
반응형
그리드형