C++/문제풀이

[C++]1992번 : 쿼드트리

이경로 2023. 7. 18. 13:36

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

 

1992번: 쿼드트리

첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또

www.acmicpc.net

 

비트값을 압축하는 문제이다. x, y축 길이가 항상 같고, 주변 4칸을 기준으로 압축하기 때문에 범위를 절반씩 줄여 가며 압축한다.

 

#include <bits/stdc++.h>
using namespace std;
int n;
string m[64];

string zip(int a, int b, int scale){
    char c = m[a][b];
    if(scale == 1) return string(1, m[a][b]);
    for(int x = a; x < a+scale; x++){
        for(int y = b; y < b+scale; y++){
            if(m[x][y] != c){
                return "(" + zip(a, b, scale/2) + 
                zip(a, b+scale/2, scale/2) + zip(a+scale/2, b, scale/2)
                + zip(a+scale/2, b+scale/2, scale/2) + ")";
            }
        }
    }
    return string(1, m[a][b]);
}

int main()
{
    cin >> n;
    for(int x = 0; x < n; x++){
        cin >> m[x];
    }
    cout << zip(0, 0, n);
}

시작 좌표와 매트릭스의 너비를 받은 뒤, for문으로 해당 범위 내의 숫자를 탐색하며 모든 숫자가 같다면 처음 숫자를 반환하고, 하나라도 다른 숫자가 있다면 탐색 범위를 x, y축 절반으로 줄여 나가면서 재귀를 수행한다.