본문 바로가기
BOJ

BOJ 1992 쿼드트리

by 홍code 2022. 3. 17.

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

 

1992번: 쿼드트리

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

www.acmicpc.net

요약

BOJ 1780 종이의 개수와 매우 유사한 문제

0, 1로 이루어진 N x N의 행렬이 있을 때  전체 영역이 모두 같은 값이라면 한 개로 압축하고,

그게 아니라면 가로 2, 세로 2 영역으로 4등분하여 각 영역이 모두 같은 값으로 이루어질 때까지 나누었을 때  압축한 결과를 괄호에 싸서 출력하는 문제.

풀이

전형적인 분할정복 문제!! 부분 행렬의 전부를 탐색했을 때 모두 같은 값이라면 한 개로 압축하도록 기저를 잡고 그게 아니라면 재귀 함수를 이용해서 4 등분하여 조건에 해당하는지 확인하고 각 영역의 답을 모두 합병해준다. 재귀 함수를 돌리기 전에 괄호를 넣어주고 재귀가 끝날 때 괄호를 닫아준다.

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
using namespace std;
int n, arr[65][65];
int ans[3];
void sol(int d, int r, int cnt) {
    int num = arr[d][r];
    int chk = -1;
    for (int i = d; i < d + cnt; i++) {
        for (int j = r; j < r + cnt; j++) {
            if (num != arr[i][j]) {
                chk = 1;
            }
        }
    }
    if (chk == -1) {
        cout << num;
        return;
    }
    int div = cnt / 2;
    cout << "(";
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            sol(d + div * i, r + div * j, div);
        }
    }
    cout << ")";
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
             scanf("%1d",&arr[i][j]);
        }
    }
    sol(00, n);
    cout << "\n";
}
cs

'BOJ' 카테고리의 다른 글

BOJ 9012 괄호  (0) 2022.03.24
BOJ 1780 종이의 개수  (0) 2022.03.14
BOJ 1725 히스토그램  (0) 2022.03.14
BOJ 2104 부분배열 고르기  (2) 2022.03.12
BOJ 1629 곱셈  (0) 2022.03.12

댓글