[10026] 적록색약

!·2022년 7월 4일
0

BFS/DFS

목록 보기
9/17

내 코드

#include <iostream>
#include <utility>
#include <queue>
using namespace std;

char field[101][101];
bool isvisit[101][101];
bool isvisit2[101][101];
int xdis[4] = {1,0,-1,0};
int ydis[4] = {0,1,0,-1};
int r,g,k;
int x,y;

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n; cin >> n;
    for(int i =0;i<n;i++)
    {
        for(int j =0;j<n;j++)
        {
            cin >> field[i][j];
        }
    }
    queue <pair<int,int>> q;
    queue <pair<int,int>> q2;
    for(int a = 0; a<n;a++)
    {
        for(int b = 0; b<n;b++)
        {
            if(field[a][b] == 'R' && isvisit[a][b] == false)
            {
                r++;
                q.push({a,b});
                isvisit[a][b] = true;
                while(!q.empty())
                {
                    pair<int,int> p = q.front(); q.pop();
                    for(int i =0;i<4;i++)
                    {
                        int curx = p.first + xdis[i];
                        int cury = p.second + ydis[i];
                        if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
                        if(isvisit[curx][cury] || field[curx][cury] != 'R') continue;
                        q.push({curx,cury});
                        isvisit[curx][cury] = true;
                    }
                }
            }
            else if(field[a][b] == 'G' && isvisit[a][b] == false)
            {
                g++;
                q.push({a,b});
                isvisit[a][b] = true;
                while(!q.empty())
                {
                    pair<int,int> p = q.front(); q.pop();
                    for(int i =0;i<4;i++)
                    {
                        int curx = p.first + xdis[i];
                        int cury = p.second + ydis[i];
                        if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
                        if(isvisit[curx][cury] || field[curx][cury] != 'G') continue;
                        q.push({curx,cury});
                        isvisit[curx][cury] = true;
                    }
                }
            }
            else if(field[a][b] == 'B' && isvisit[a][b] == false)
            {
                k++;
                q.push({a,b});
                isvisit[a][b] = true;
                while(!q.empty())
                {
                    pair<int,int> p = q.front(); q.pop();
                    for(int i =0;i<4;i++)
                    {
                        int curx = p.first + xdis[i];
                        int cury = p.second + ydis[i];
                        if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
                        if(isvisit[curx][cury] || field[curx][cury] != 'B') continue;
                        q.push({curx,cury});
                        isvisit[curx][cury] = true;
                    }
                }
            }
        }
    }
    for(int a = 0;a<n;a++)
    {
        for(int b= 0; b<n;b++)
        {
            if((field[a][b] == 'R' || field[a][b] == 'G') && isvisit2[a][b] == false)
            {
                x++;
                q2.push({a,b});
                isvisit2[a][b] = true;
                while(!q2.empty())
                {
                    pair<int,int> p = q2.front(); q2.pop();
                    for(int i =0;i<4;i++)
                    {
                        int curx = p.first + xdis[i];
                        int cury = p.second + ydis[i];
                        if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
                        if(isvisit2[curx][cury] || field[curx][cury] == 'B') continue;
                        q2.push({curx,cury});
                        isvisit2[curx][cury] = true;
                    }
                }
            }
            else if(field[a][b] == 'B' && isvisit2[a][b] == false)
            {
                y++;
                q2.push({a,b});
                isvisit2[a][b] = true;
                while(!q2.empty())
                {
                    pair<int,int> p = q2.front(); q2.pop();
                    for(int i =0;i<4;i++)
                    {
                        int curx = p.first + xdis[i];
                        int cury = p.second + ydis[i];
                        if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
                        if(isvisit2[curx][cury] || field[curx][cury] != 'B') continue;
                        q2.push({curx,cury});
                        isvisit2[curx][cury] = true;
                    }
                }
            }
        }
    }
    cout << r+g+k << ' ' << x+y;
}
  • 적록색약을 가진 사람은 빨간색과 녹색을 동일한 색으로 취급한다. 따라서 적록색약을 가진사람과 갖지 않은 사람을 구별하여 visit배열 을 따로 선언한다!
  • 각각의 범위에 bfs 를 돌때마다 선언한 변수에 +1 을 하여 을 출력하면 해결!

정답

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
char board[101][101];
bool vis[101][101];
int n;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 }; 

void bfs(int i, int j) {
  queue<pair<int, int>> Q;
  Q.push({ i,j });
  vis[i][j] = 1;
  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 (vis[nx][ny] == 1 || board[i][j] != board[nx][ny]) continue;
      vis[nx][ny] = 1;
      Q.push({ nx,ny });
    }
  }
}

int area(){
  int cnt = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (!vis[i][j]) {
        cnt++;
        bfs(i, j);
      }
    }
  }
  return cnt;
}

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cin >> board[i][j];
    }
  }
  int not_g = area(); //적록색약이 아닌사람

  // 적록색약인 사람을 구하기위한 방문배열 초기화
  for(int i = 0; i < n; i++)
    fill(vis[i], vis[i]+n, false);
  
  // 적록색약은 초록과 빨강을 구분 못하므로 초록이면 빨강으로 바꿔줌
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (board[i][j] == 'G')
        board[i][j] = 'R';
    }
  }

  int is_g = area(); //적록색약인 사람
  cout << not_g << " " << is_g;
  return 0;
}
  • 변수를 따로 선언하지 않고 함수의 리턴값 이용하고 있다.
  • 또한, r``g``b 배열을 적록색약인 사람의 경우 rg로 바꿔 단순하게 처리하고 있다.. 훨씬 더 깔끔하다.
profile
개발자 지망생

0개의 댓글