DAMPER's blog

1992 쿼드트리 본문

Problem Solving/BOJ 문제풀이

1992 쿼드트리

DAMPER 2021. 1. 11. 01:08
728x90

www.acmicpc.net/problem/1992

 

1992번: 쿼드트리

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

www.acmicpc.net

<아이디어>

알고리즘 문제해결전략 책에 소개된 알고스팟 문제와 유사한 문제이다.

damper.tistory.com/4

 

[ALGOSPOT] QUADTREE

출처 : algospot.com/judge/problem/read/QUADTREE <문제> 대량의 좌표 데이터를 메모리 안에 압축해 저장하기 위해 사용하는 여러 기법 중 쿼드 트리(quad tree)란 것이 있습니다. 주어진 공간을 항상 4개로 분..

damper.tistory.com

전형적인 분할정복 문제.

문제를 4부분으로 쪼갠 후 (좌상 우상 좌하 우하), 각 부분을 모두 0이거나 1일때까지 계속해서 4부분으로 쪼갠다.

모두 0이거나 1인 부분이 나오면 (또는 나눈 부분의 크기가 1인 부분) 그대로 해당 문자를 return 한다.

return을 받았다면 4부분을 합쳐서 다시 return 한다.

 

최종적으로 return 한 문자열을 출력하면 끝.

 

 

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
#include <bits/stdc++.h>
using namespace std;
#define swap(a,b) (a)^=(b)^=(a)^=(b)
#define endl '\n'
typedef long long lld;
 
string div_s(vector<string>& v, int sizeint y, int x)
{
    bool flag = true;
    for(int i=y;i<y+size;i++)
        for(int j=x;j<x+size;j++)
            if(v[i][j]!=v[y][x]) flag = false;
    if(flag) return string(1, v[y][x]);
    size /= 2;
    return "("+div_s(v, size, y, x)+div_s(v, size, y, x+size)+
    div_s(v, size, y+size, x)+div_s(v, size, y+size, x+size)+")";
 
}
 
int main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL);
    cout.tie(NULL);
 
    int n;
    cin>>n;
    vector<string> v(n, "");
    for(int i=0;i<n;i++)
        cin>>v[i];
    cout<<div_s(v, n, 00);
    
    return 0;
}
cs

728x90

'Problem Solving > BOJ 문제풀이' 카테고리의 다른 글

9019 DSLR  (0) 2021.04.25
5525 IOIOI  (0) 2021.01.11
7662 이중 우선순위 큐  (0) 2021.01.08
1541 잃어버린 괄호  (0) 2021.01.05
11687 팩토리얼 0의 개수  (0) 2021.01.04