(백준) (C++) 제10026호

*먼저 문제를 보자*



문항 레벨은 골드 5로 비교적 높은 편이며 정답률은 약 56%이다.

호스트가 문제를 확인하면 일반적인 DFS 문제 그게 다라고 생각했습니다.

바로 코드를 살펴보겠습니다(전체 코드는 아래 참조).

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int dir_x(4){-1,0,1,0};
int dir_y(4){0,1,0,-1};
int map_noraml(101)(101){0};
int map_dif(101)(101){0};// 1: R / 2: G / 3: B
int visited(101)(101){0};
int n,color=0,cnt1=0,cnt2=0;
void dfs1(int x,int y){
    color=map_noraml(x)(y);
    visited(x)(y)=1;
    for(int i=0;i<4;i++){
        int dx=x+dir_x(i);
        int dy=y+dir_y(i);
        if(dx<0 || dx>n || dy<0 || dy>n)continue;
        if(map_noraml(dx)(dy)==color && !visited(dx)(dy)){
            dfs1(dx,dy);
        }
    }
}
void dfs2(int x,int y){
    color=map_dif(x)(y);
    visited(x)(y)=1;
    for(int i=0;i<4;i++){
        int dx=x+dir_x(i);
        int dy=y+dir_y(i);
        if(dx<0 || dx>n || dy<0 || dy>n)continue;
        if(map_dif(dx)(dy)==color && !visited(dx)(dy)){
            dfs2(dx,dy);
        }
    }
}
int main(){
    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);
    
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            char tmp;
            cin>>tmp;
            if(tmp=='R'){map_noraml(i)(j)=1; map_dif(i)(j)=1;}
            else if(tmp=='G'){map_noraml(i)(j)=2; map_dif(i)(j)=1;}
            else if(tmp=='B'){map_noraml(i)(j)=3; map_dif(i)(j)=2;}
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(!visited(i)(j)){
                cnt1++;
                dfs1(i,j);
            }
        }
    }
    memset(visited,0,sizeof(visited));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(!visited(i)(j)){
                cnt2++;
                dfs2(i,j);
            }
        }
    }
    cout<<cnt1<<' '<<cnt2;
    return 0;
}

memset 사용 시 참고 사항 string.h 또는 memory.h 도서관

포함되지 않은 경우 백준 채점 시 컴파일 오류가 발생합니다.

-기여 결과-