Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

devchang

백준 10026(적록색약) 풀이 본문

알고리즘

백준 10026(적록색약) 풀이

devchang 2024. 9. 24. 15:31

문제

입력

출력

 

문제풀이

#include <iostream>
#include <queue>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);

  string a[100];
  int n;
  bool vis[100][100] = {false,};
  bool vis2[100][100] = {false,};
  queue<pair<int,int>> q;
  queue<pair<int,int>> q2;
  int cnt = 0;
  int cnt2 = 0;
  int x[4] = {-1,0,1,0};
  int y[4] = {0,-1,0,1};

  cin>>n;

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

  for(int i=0; i<n; i++){
    for(int j=0; j<n; j++){

      if(vis[i][j]){
        continue;
      }

      q.push({i,j});
      cnt++;

      if(a[i][j] == 'R'){
        while(!q.empty()){
          pair<int,int> tmp = q.front();
          q.pop();

          for(int k=0; k<4; k++){
            int tmpx = tmp.first + x[k];
            int tmpy = tmp.second + y[k];

            if(tmpx < 0 || tmpy < 0 || tmpx > n-1 || tmpy > n-1){
              continue;
            }

            if(a[tmpx][tmpy] != 'R' || vis[tmpx][tmpy]){
              continue;
            }

            q.push({tmpx,tmpy});
            vis[tmpx][tmpy] = true;
          }
        }
      }else if(a[i][j] == 'G'){
        while(!q.empty()){
          pair<int,int> tmp = q.front();
          q.pop();

          for(int k=0; k<4; k++){
            int tmpx = tmp.first + x[k];
            int tmpy = tmp.second + y[k];

            if(tmpx < 0 || tmpy < 0 || tmpx > n-1 || tmpy > n-1){
              continue;
            }

            if(a[tmpx][tmpy] != 'G' || vis[tmpx][tmpy]){
              continue;
            }

            q.push({tmpx,tmpy});
            vis[tmpx][tmpy] = true;
          }
        }
      }else{
        while(!q.empty()){
          pair<int,int> tmp = q.front();
          q.pop();

          for(int k=0; k<4; k++){
            int tmpx = tmp.first + x[k];
            int tmpy = tmp.second + y[k];

            if(tmpx < 0 || tmpy < 0 || tmpx > n-1 || tmpy > n-1){
              continue;
            }

            if(a[tmpx][tmpy] != 'B' || vis[tmpx][tmpy]){
              continue;
            }

            q.push({tmpx,tmpy});
            vis[tmpx][tmpy] = true;
          }
        }
      }
    }
  }

  for(int i=0; i<n; i++){
    for(int j=0; j<n; j++){

      if(vis2[i][j]){
        continue;
      }

      q2.push({i,j});
      cnt2++;

      if(a[i][j] != 'B'){
        while(!q2.empty()){
          pair<int,int> tmp = q2.front();
          q2.pop();

          for(int k=0; k<4; k++){
            int tmpx = tmp.first + x[k];
            int tmpy = tmp.second + y[k];

            if(tmpx < 0 || tmpy < 0 || tmpx > n-1 || tmpy > n-1){
              continue;
            }

            if(a[tmpx][tmpy] == 'B' || vis2[tmpx][tmpy]){
              continue;
            }

            q2.push({tmpx,tmpy});
            vis2[tmpx][tmpy] = true;
          }
        }
      } else{
        while(!q2.empty()){
          pair<int,int> tmp = q2.front();
          q2.pop();

          for(int k=0; k<4; k++){
            int tmpx = tmp.first + x[k];
            int tmpy = tmp.second + y[k];

            if(tmpx < 0 || tmpy < 0 || tmpx > n-1 || tmpy > n-1){
              continue;
            }

            if(a[tmpx][tmpy] != 'B' || vis2[tmpx][tmpy]){
              continue;
            }

            q2.push({tmpx,tmpy});
            vis2[tmpx][tmpy] = true;
          }
        }
      }
    }
  }

  cout<<cnt<<' '<<cnt2;
}

 

이 문제는 bfs로 해결할 수 있다.

 

처음에는 for문으로 시작점이 될 수 있는 위치를 찾고 
bfs를 돌려 인접한 같은 색으로 이루어진 영역을 찾아 개수를 세면 되는데

색약일 때 아닐 때를 찾아서 개수를 세야하므로 bfs를 2번 실행하면 된다.

색약일 때는 R과 G를 한 색으로 생각하고 영역을 세도록 bfs를 하면 이 문제는 해결된다.

 

 

'알고리즘' 카테고리의 다른 글

백준 7562(나이트의 이동) 풀이  (0) 2024.09.24
백준 4179(불!) 풀이  (0) 2024.09.24
백준 7576(토마토) 풀이  (0) 2024.09.24
백준 1920번(수 찾기) 풀이  (1) 2024.04.20
알고리즘  (0) 2024.04.20