https://www.acmicpc.net/problem/1992
1992번: 쿼드트리
첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또
www.acmicpc.net
- 2630, 색종이 만들기에서 아주 조금 응용하면 풀 수 있다. (응용이 맞나..?)
- 재귀 + 분할정복의 방법으로 해결한다.
- '('와 ')'의 삽입 타이밍 또한 생각해 본다.
더보기
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// global
string answer;
vector<vector<int>> board;
enum QUAD
{
e_Zero = 0,
e_One = 1
};
struct POS
{
POS(int _r, int _c)
: row(_r)
, col(_c)
{}
int row;
int col;
};
// method
void CalcQuadTree(int N, POS pos);
bool IsCompress(int N, POS pos, QUAD quad);
int main()
{
/*
* 주어진 영상이 모두 0으로만 되어있으면 압축 결과 = 0
* 모두 1으로만 되어있으면 압축 결과 = 1
* 만약 0과 1이 섞여 있으면 전체를 한 번에 나타내지를 못하고
* 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 4개의 영상으로 압축하게 된다.
* 이 4개의 영역을 압축한 결과를 차례대로 괄호 안에 묶어서 표시한다.
*/
// init
std::ios::sync_with_stdio(false);
// input
int N = 0;
(void)scanf("%d", &N);
for (int idx = 0; idx < N; idx++)
{
vector<int> rowList;
for (int jdx = 0; jdx < N; jdx++)
{
int data = 0;
(void)scanf("%1d", &data);
rowList.push_back(data);
}
board.push_back(rowList);
}
// calc
answer.clear();
POS startPos(0, 0);
CalcQuadTree(N, startPos);
// print
printf("%s\n", answer.c_str());
return 0;
}
void CalcQuadTree(int N, POS pos)
{
bool isZero = false;
bool isOne = false;
isZero = IsCompress(N, pos, QUAD::e_Zero);
if (false == isZero)
isOne = IsCompress(N, pos, QUAD::e_One);
if (true == isZero || true == isOne)
return;
// area - 1
answer += '(';
POS areaPos_1 = pos;
CalcQuadTree(N / 2, areaPos_1);
// area - 2
POS areaPos_2(pos.row, pos.col + (N / 2));
CalcQuadTree(N / 2, areaPos_2);
// area - 3
POS areaPos_3(pos.row + (N / 2), pos.col);
CalcQuadTree(N / 2, areaPos_3);
// area - 4
POS areaPos_4(pos.row + (N / 2), pos.col + (N / 2));
CalcQuadTree(N / 2, areaPos_4);
answer += ')';
}
bool IsCompress(int N, POS pos, QUAD quad)
{
for (int row = pos.row; row < pos.row + N; row++)
{
for (int col = pos.col; col < pos.col + N; col++)
{
if (quad != static_cast<QUAD>(board[row][col]))
return false;
}
}
if (QUAD::e_Zero == quad)
answer += '0';
else
answer += '1';
return true;
}
'Coding Problem > 백준' 카테고리의 다른 글
[백준] 2740 - 행렬 곱셈 (0) | 2021.06.22 |
---|---|
[백준] 1780 - 종이의 개수 (0) | 2021.06.21 |
[백준] 2630 - 색종이 만들기 (0) | 2021.06.21 |
[백준] 11050 - 이항계수2 (0) | 2021.06.01 |
[백준] 2004 - 조합 0의 개수 (0) | 2021.06.01 |