※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1992번 문제인 쿼드트리이다.
문제는 아래 링크를 확인하자.

www.acmicpc.net/problem/1992

 

1992번: 쿼드트리

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

www.acmicpc.net

이 문제는 문제에 주어진, 단순한 상황에서 쿼드트리(quadtree)를 구현하는 문제이다.

쿼드트리는 2차원 데이터를 압축, 저장할 수 있는 대표적인 자료구조이다. 쿼드트리는 leaf node를 제외한 각 node에서 이 node가 가리키는 2차원 데이터를 4등분한 데이터를 담고있는 node 4개를 가진다. leaf node에 저장된 값은 조각난 조각을 대표하는 값으로 볼 수 있다.

(출처: en.wikipedia.org/wiki/Quadtree)

 

이 문제에서는 0과 1로 이루어진 흑백이미지를 쿼드트리를 이용하여 압축하는 것을 구현해본다.

만약 조각에 다른 숫자가 끼어있다면, 조각을 4등분하고 각 나뉜 부분조각들에 대해서 이를 반복하면 된다.

 

각 조각에 들어있는 숫자의 총합을 이용하면 이 조각에 다른 숫자가 들어있는지 쉽게 판단할 수 있다.

n by n 조각이 1로 가득 차있다면 각 성분의 총합은 n*n일 것이고, 0으로 가득 차있다면 0일 것이기 때문이다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::string;

int screen[64][64];

void func(int n, int x, int y) {
    int num = 0;
    for (int i = x; i < x + n;i++) { // 각 조각의 모든 성분의 합
        for (int j = y;j < y + n;j++) {
            num += screen[i][j];
        }
    }
    if (num == 0) cout << 0; // 조각 성분 합이 0이면 0으로 가득 찬 것
    else if (num == n * n) cout << 1; // 조각 성분 합이 n*n이면 1으로 가득 찬 것
    else {
        n /= 2;
        cout << '(';
        func(n, x, y); // 왼쪽 위 조각
        func(n, x, y + n); // 오른쪽 위 조각
        func(n, x + n, y); // 왼쪽 아래 조각
        func(n, x + n, y + n); // 오른쪽 아래 조각
        cout << ')';
    }
}

int main()
{
    int n;
    cin >> n;
    string s;
    for (int i = 0;i < n;i++) {
        cin >> s;
        for (int j = 0;j < n;j++) {
            if (s[j] == '0') {
                screen[i][j] = 0;
            }
            else screen[i][j] = 1;
        }
    }
    func(n, 0, 0);

    return 0;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 14500 // C++] 테트로미노  (0) 2021.01.31
[BOJ 11403 // C++] 경로 찾기  (0) 2021.01.30
[BOJ 1963 // C++] 소수 경로  (0) 2021.01.28
[BOJ 9020 // C++] 골드바흐의 추측  (0) 2021.01.27
[BOJ 20495 // C++] 수열과 헌팅  (0) 2021.01.26

+ Recent posts