Baekjoon Review

[Silver 1] 1992 쿼드 트리

hanseongbugi 2024. 9. 14. 17:18

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

 

원래 존재하는 image의 값이 다를 경우 4등분 해야 함을 알 수 있다.

이는 분할 정복을 사용해 문제를 해결해야 함을 알 수 있다.

 

자를 때는 왼쪽 위, 오른 쪽 위, 왼쪽 아래, 오른쪽 아래 순으로 잘라야한다.

등분은 4등분이기 때문에 area/2를 해준다.

quadTree(y, x, area/2);
quadTree(y, x + area/2, area/2);
quadTree(y + area/2, x, area/2);
quadTree(y + area/2, x + area/2, area/2);

 

배열을 순회하여 같은 문자가 아닐 시에 자르고 같으면 값을 출력해준다.

 

#include <iostream>
using namespace std;

int N;
char image[65][65];

void quadTree(int y, int x, int area){
    bool same = true;

    for(int i = y;i<area + y;i++){
        for(int j = x;j<area + x;j++){
            if(image[i][j] != image[y][x]){
                same = false;
                break;
            }
        }
        if(!same)
            break;
    }
    
    if(!same){
        cout<<"(";
        quadTree(y, x, area/2);
        quadTree(y, x + area/2, area/2);
        quadTree(y + area/2, x, area/2);
        quadTree(y + area/2, x + area/2, area/2);
        cout<<")";
    }
    else{
        if(image[y][x] == '0')
            cout<<0;
        else
            cout<<1;
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    cin>>N;
    for(int i = 0;i<N;i++){
        for(int j = 0;j<N;j++)
            cin>>image[i][j];
    }

    quadTree(0, 0, N);
}