이 문제는 크게 어렵지 않았다. 그냥 전형적인 재귀함수 문제였다. 

작은 예제부터 천천히 생각해본다면 쉽게 해결할수있었다.

모든 사분면이 같은 숫자면 그 숫자 출력하고 아니면 하나씩 분리해서 출력한다. 

2x2일때부터 생각해보면 쉽게 할수있다.

단, 입력받을때 string으로 받고 하나씩 넣어줘야하는 불편함이 있으니 주의해야한다.

#include <iostream>

using namespace std;

int board[64][64];

void dfs(int N, int x, int y){
    int ao=0;
    int az=0;
    if(N==1){
        cout<<board[x][y];
        return ;
    }
    for(int i=x;i<x+N;i++){
        for(int j=y;j<y+N;j++){
            if(board[i][j]==1){
                ao++;
            }
            else{
                az++;
            }
        }
    }
    if(ao==N*N){
        cout<<1;
    }
    else if(az==N*N){
        cout<<0;
    }
    else{
        cout<<"(";
        dfs(N/2,x,y);
        dfs(N/2,x,y+N/2);
        dfs(N/2,x+N/2,y);
        dfs(N/2,x+N/2,y+N/2);
        cout<<")";
    }

}

int main(){
    int N;
    string str;
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>str;
        for(int j=0;j<N;j++){
            board[i][j]=str[j]-'0';
        }
    }
    dfs(N,0,0);
    return 0;
}

+ Recent posts