[백준 10026] 적록색약

silverCastle·2021년 12월 31일
0

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

✍️ 첫번째 접근

적록색약이 아닌 경우일 때의 BFS적록색약인 경우의 BFS를 돌리면 된다.
만약, 적록색약일 경우에는 빨간색과 초록색의 차이를 못 느끼기 때문에 필자 같은 경우는 칸이 빨간색이라면 초록색으로 바꾸어서 진행하였다.
코드를 살펴보면 겹치는 부분이 상당수라 이 부분을 따로 함수를 만들어서 하는 것이 보기 더 깔끔하다고 생각한다.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
string board[102];
bool vist1[102][102];
bool vist2[102][102];
int n;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> board[i];
    }

    // 적록색약이 아닌 사람을 위한 bfs
    int cnt1 = 0;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(vist1[i][j] == true)
                continue;
            queue<pair<int,int> > Q;
            Q.push(make_pair(i,j));
            vist1[i][j] = true;
            ++cnt1;
            char ch = board[i][j];
            while(!Q.empty()) {
                pair<int,int> 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(board[nx][ny] != ch || vist1[nx][ny])
                        continue;
                    Q.push(make_pair(nx,ny));
                    vist1[nx][ny] = true;
                }
            }
        }
    }

    // 적록색약인 사람을 위한 bfs
    // 빨간색과 초록색을 같게 하기 위해
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(board[i][j] == 'R')
                board[i][j] = 'G';
        }
    }
    int cnt2 = 0;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(vist2[i][j] == true)
                continue;
            queue<pair<int,int> > Q;
            Q.push(make_pair(i,j));
            vist2[i][j] = true;
            ++cnt2;
            char ch = board[i][j];
            while(!Q.empty()) {
                pair<int,int> 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(board[nx][ny] != ch || vist2[nx][ny])
                        continue;
                    Q.push(make_pair(nx,ny));
                    vist2[nx][ny] = true;
                }
            }
        }
    }    


    cout << cnt1 << ' ' << cnt2;

    return 0;
}

0개의 댓글