본문 바로가기
BaekJoon/C++

10026 : 적록색약 (C++)

by GrayChoi 2021. 2. 12.
반응형

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net


오랜만에 풀어보는 그래프탐색 문제

한 개의 dfs함수를 만들어서 문제를 해결 해 보고 싶었지만

결국 두개로 나누어 만들어 문제를 해결했다.

한개로 합쳐 만들 수 있을까?

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

using namespace std;

char map[100][100];
bool visit[100][100];
bool visitColor[100][100];

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

void dfs(int x, int y) {
    // 정상일 때의 dfs탐색
    visit[x][y] = true;
    
    for(int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if(nx >= 0 && nx < N && ny >= 0 && ny < N) {
            // 각각 현재의 색과 다음의 탐색하려는 색깔의 색이 일치할 때 다음 탐색을 시작한다.
            if(map[x][y] == 'R' && map[nx][ny] == 'R' && visit[nx][ny] == false) {
                dfs(nx, ny);
            } else if(map[x][y] == 'G' && map[nx][ny] == 'G' && visit[nx][ny] == false) {
                dfs(nx, ny);
            } else if(map[x][y] == 'B' && map[nx][ny] == 'B' && visit[nx][ny] == false) {
                dfs(nx, ny);
            }
        }
    }
}

void dfsColor(int x, int y) {
    // 색약이 있을 때의 dfs탐색
    visitColor[x][y] = true;
    
    for(int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if(nx >= 0 && nx < N && ny >= 0 && ny < N) {
            // 적색과 녹색의 색이 동일하다고 느끼므로 다음과 같이 탐색을 실행한다.
            if((map[x][y] == 'R' || map[x][y] == 'G')
                && (map[nx][ny] == 'R' || map[nx][ny] == 'G')
                    && visitColor[nx][ny] == false)
            {
                dfsColor(nx, ny);
            } else if(map[x][y] == 'B' && map[nx][ny] == 'B' && visitColor[nx][ny] == false) {
                dfsColor(nx, ny);
            }
        }
    }
}

int main() {
    cin >> N;

    for(int i = 0; i < N; i++) {
        string temp;
        cin >> temp;

        for(int j = 0; j < N; j++) {
            map[i][j] = temp[j];
        }

    }

    // 탐색을 다르게 하는 두개의 dfs함수를 만들어 실행하였다.
    // 한개로 바꿀 수 있는 방법이 있을까?
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            if(visit[i][j] == false) {
                normal++;
                dfs(i, j);
            }
            if(visitColor[i][j] == false) {
                colorWeak++;
                dfsColor(i, j);
            }
        }
    }

    printf("%d %d\n", normal, colorWeak);

    return 0;
}
반응형

'BaekJoon > C++' 카테고리의 다른 글

2108 : 통계학 (C++)  (0) 2021.02.16
10866 : 덱 (C++)  (0) 2021.02.16
18111 : 마인크래프트 (C++)  (0) 2021.02.12
1920 : 수 찾기 (C++)  (0) 2021.02.11
2805 : 나무 자르기 (C++)  (0) 2021.02.10

댓글