ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 10026번: 적록색약
    깊이우선탐색(DFS) 2018. 7. 5. 20:01
    반응형

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

     

    1. 문제

    적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.

     

     

    크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)

     

    키워드 - DFS

     

    해당 영역에서 구할 수 있는 영역은 4 구역이다. R,G,B 기준 일반인이 구별하는 색상 이다.

     

    적록색약인 사람은 G 를 못보기 때문에 G 영역을 R 로 치환하고 DFS 를 구한다. 

     

     

    Source

     
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <algorithm>
    #include <functional>
    #include <vector>
    #include <list>
    #include <queue>
    #include <deque>
    #include <map>
    #include <set>
    #include <stack>
    #include <cstring>
    
    using namespace std;
    
    #define MAX_SIZE 100
    #define INF 0x7fffffff
    #define CENDL "\n"
    #define ll long long
    
    /*
    * @memory  - 2056 kb
    * @time    - 0 ms
    */
    
    int dx[] = {0, 1, -1, 0};
    int dy[] = {1, 0, 0, -1};
    
    int n;
    int board[101][101];
    bool visited[101][101];
    
    void dfs(int x, int y, int data) {
    
        visited[x][y] = true;
    
        for (int i=0; i<4; i++) {
            int ax = x + dx[i];
            int ay = y + dy[i];
    
            if (ax < 0 || ay < 0 || ax >= n || ay >= n) {
                continue;
            }
    
            if (visited[ax][ay]) {
                continue;
            }
    
            if (board[ax][ay] == data) {
                dfs(ax, ay, data);
            }
        }
    }
    int main() {
    
        cin.tie(0);
        std::ios::sync_with_stdio(false);
    
        cin >> n;
    
        for (int i=0; i<n; i++)    {
            string s; cin >> s;
    
            const int size = s.size();
            for(int j=0; j<n; j++) {
                if (s[j] == 'R') {
                    board[i][j] = 1;
                }
                else if (s[j] == 'G') {
                    board[i][j] = 2;
                }
                else  if (s[j] == 'B') {
                    board[i][j] = 3;
                }
                
            }
        }
    
        int sol_r = 0;
        int sol_g = 0;
        int sol_b = 0;
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
    
                if (board[i][j] == 1 && !visited[i][j]) {
                    sol_r++;
                    dfs(i, j, 1);
                }
    
                if (board[i][j] == 2 && !visited[i][j]) {
                    sol_g++;
                    dfs(i, j, 2);
                }
    
                if (board[i][j] == 3 && !visited[i][j]) {
                    sol_b++;
                    dfs(i, j, 3);
                }
            }
        }
    
        int sol_a = sol_r + sol_g + sol_b;
        
        memset(visited, 0, sizeof(visited));
    
        for (int i=0; i<n; i++)    {
            for(int j=0; j<n; j++) {
                if (board[i][j] == 1 || board[i][j] == 2) {
                    board[i][j] = 1;
                }
            }
        }
    
        sol_g = 0;
        sol_b = 0;
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
    
                if (board[i][j] == 1 && !visited[i][j]) {
                    sol_g++;
                    dfs(i, j, 1);
                }
    
                if (board[i][j] == 3 && !visited[i][j]) {
                    sol_b++;
                    dfs(i, j, 3);
                }
            }
        }
    
        int sol_aa = sol_g + sol_b;
    
        cout << sol_a << " " << sol_aa << CENDL;
    
        return 0;
    }

     

    반응형

    '깊이우선탐색(DFS)' 카테고리의 다른 글

    백준 1937번: 욕심쟁이 판다  (0) 2019.01.20
    백준 14716번: 현수막  (0) 2018.08.12
    백준 2606번: 바이러스  (0) 2018.07.01
    백준 2573번: 빙산  (0) 2018.07.01
    백준 10451번: 순열 사이클  (0) 2018.06.24

    댓글

Designed by Tistory.