본문 바로가기
IT/Algorithm

분할 정복 - 쿼드 트리 뒤집기

by 신인용 2020. 8. 5.
반응형

 

문제 출저 - 알고스팟 https://algospot.com/judge/problem/read/QUADTREE

 

 

 

 

이것에 중점을 둬보자.

- 분할하고, 정복한다.

- 재귀 던져준 후에는 생각말자.

 

 

 

절차

- 트리를 입력 받는다. (string)

- 입력을 분석 (분할)

- 트리를 상하로 뒤집어서 출력

 

 

 

일단 입력을 받고 분할해보자.

아직 분할정복이 감이 안잡혔다. 문제를 보고 분할정복해야지 라는 생각을 못함. 일단 공부하는 부분이 분할정복이라서 어떻게 분할할지 생각해보자.

 

string tree를 입력받는다.

w나 b이면 return w, b; -> 기저사례

x이면 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <string>
 
using namespace std;
 
string func(string s) {
    string current;
    int size = s.size();
 
    // 현재 tree
    current = s;
 
    // 기저사례
    if (current[0== 'w'return "w";
    if (current[0== 'b'return "b";
 
    int n = 0;
 
    // 왼쪽위
    n++;
    current = s.substr(n, size);
    string lu = func(current);
    // 오른쪽위
    n += lu.length(); // 왼쪽위 다음 문자열부터
    current = s.substr(n, size);
    string ru = func(current);
    // 왼쪽아래
    n += ru.length();
    current = s.substr(n, size);
    string ld = func(current);
    // 오른쪽아래
    n += ld.length();
    current = s.substr(n, size);
    string rd = func(current);
 
    // 정복? 병합? 해결?
    return "x" + ld + rd + lu + ru;
}
 
int main() {
    cin.sync_with_stdio(false);
    
    int T;
    string tree;
    cin >> T;
 
    for (int i = 0; i < T; ++i) {
        cin >> tree;
        cout << func(tree) << "\n";
    }
}
cs

 

 

 

 

 

반응형

'IT > Algorithm' 카테고리의 다른 글

선형 자료 구조 (동적 배열, 연결 리스트)  (0) 2020.08.17
탐욕법 - 도시락 데우기  (0) 2020.08.17
해시 (Hash) - 전화번호 목록  (3) 2020.02.20
해시 (Hash) - 완주하지 못한 선수  (0) 2020.02.20
해시 (Hash)  (0) 2020.02.18

댓글