[분할 정복] QUADTREE
2021. 1. 3. 22:52ㆍ알고리즘/알고리즘 문제 [easy]
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>
//all black -> b
//all white -> w
//all different - > quad : x(left up)(right up)(left down)(right down)
//Upside down
void dividePicture(const std::string& picture, std::string (&pieces)[4], int index, int currentPiece, int count)
{
if(index < picture.length())
{
pieces[currentPiece] += picture.at(index);
if(count == 0 && picture.at(index) != 'x')
return dividePicture(picture, pieces, index + 1, currentPiece + 1, count);
else if(picture.at(index) != 'x')
return dividePicture(picture, pieces, index + 1, currentPiece, count - 1);
else if(picture.at(index) == 'x')
return dividePicture(picture, pieces, index + 1, currentPiece, count + 3);
}
return;
}
std::string upsideDown(std::string picture)
{
std::string pieces[4] = {"", "", "", ""}, upsideDownPicture = "";
if(picture.at(0) == 'x')
{
dividePicture(picture, pieces, 1, 0, 0);
upsideDownPicture = "x" + upsideDown(pieces[2]) + upsideDown(pieces[3])
+ upsideDown(pieces[0]) + upsideDown(pieces[1]);
return upsideDownPicture;
}
else
return picture;
}
int main(void)
{
int testCase = 0;
std::string picture = "";
std::cin>>testCase;
for(int i = 0; i < testCase; i++)
{
std::cin>>picture;
std::cout<<upsideDown(picture)<<std::endl;
}
}
|
cs |
1. 문제를 더 작은 문제로 분할
그림을 4등분하여 각각의 그림에 대해 재귀호출한다. (n)
2. 각 문제에 대해 구한답을 원래 문제에 대한 답으로 병합
각 부분문제는 + 연산자에 의해 병합되어진다. (n)
3. 시간 복잡도 계산
upsideDown함수가 n번 실행되면 각각 단계마다
dividePicture가 n*log(4)n번 실행되므로
O(n) + O(nlgn)만큼의 시간이 걸린다.
4. 더 빠른 시간안에 수행할 수 있는지?
dividePicure 함수에서 각각 문자열을 하나씩 대조하지 않고
upsideDown 함수에서 각각 문자열을 하나씩 대조하여
'x'가 나오면 좌->우 상->하 순서대로 분할하면서 문자 대조,
'b', 'w'가 나오면 리턴 하도록 구현하면
결국 n 번의 수행만에 답을 구할 수 있게 된다.
'알고리즘 > 알고리즘 문제 [easy]' 카테고리의 다른 글
[동적 계획법] PI 원주율 외우기 (0) | 2021.01.09 |
---|---|
[동적 계획법] WILDCARD 와일드 카드 (0) | 2021.01.07 |
[Brute-force] Synchronizing Clocks (0) | 2021.01.01 |
[Brute-force]BOARDCOVER 게임판 덮기 (0) | 2020.12.30 |
[Brute-force] PICNIC 피크닉 (0) | 2020.12.29 |