백준 10026번: 적록색약

danbibibi·2022년 2월 21일
0

문제

문제 바로가기> 백준 10026번: 적록색약

풀이

먼저 적록색약이 아닌 사람의 dfs 탐색을 진행한 후, R을 G로 바꾸어 적록색약인 사람의 탐색을 진행하였다!

#include<iostream>
#include<cstring>
#include<string>
#define MAX 101
using namespace std;

int N, ans=0;
char grid[MAX][MAX];
bool visit[MAX][MAX];
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};

void dfs(int y, int x){
    visit[y][x] = true; // 방문 여부 update
    for(int i=0; i<4; i++){
        int ny = y+dy[i];
        int nx = x+dx[i];
        if(ny<0 || ny>=N || nx<0 || nx>=N) continue; // 범위를 벗어나는 경우
        if(visit[ny][nx]) continue; // 이미 방문한 경우
        if(grid[ny][nx]!=grid[y][x]) continue; // 연결된 색상이 같은 색상이 아닌 경우
        dfs(ny, nx);
    }
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    string str; cin >> N;
    for(int i=0; i<N; i++){ // 문자열 -> char
        cin >> str;
        for(int j=0; j<N; j++) grid[i][j] = str[j];
    }

    // 적록 색약이 아닌 사람
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            if(!visit[i][j]) { // 방문하지 않은 경우
                dfs(i, j); // 주변까지 탐색
                ans++;
            }
        }
    }
    cout << ans << " ";

    // 적록 색약인 사람
    // 초기화
    ans = 0;
    memset(visit, false, sizeof(visit));
    
    // red -> green
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            if(grid[i][j]=='R') grid[i][j] = 'G';
        }
    }
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            if(!visit[i][j]) { // 방문하지 않은 경우
                dfs(i, j); // 주변까지 탐색
                ans++;
            }
        }
    }
    cout << ans;
}
profile
블로그 이전) https://danbibibi.tistory.com

0개의 댓글

관련 채용 정보