본문 바로가기
알고리즘/백준

[백준] 1992 쿼드트리 c++

by 오오오니 2022. 5. 14.

https://www.acmicpc.net/problem/1992

 

1992번: 쿼드트리

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

www.acmicpc.net

예전에 풀어봤던 분할 문제하고 비슷해서 금방 풀었다.

1.n*n 크기의 사각형을 검사한다.

2.전부 0이거나 1이면 문자열에 0이나 1을 추가해준다.

3. 아니면 문자열에 (을 추가하고  n/2*n/2 크기의 사각형 4개로 분할해서 사각형을 검사한다.

4. 분할한 사각형을 다 검사하면 )을 문자열에 추가한다.

*입력이 문자열로 들어오기 때문에 잘라서 int로 바꿔서 배열에 넣어줘야한다.

*배열안에 다른 값이 한 개라도 있으면 분할 해야하기때문에 배열의 한 값하고 다른 값을 비교하는 것보다

0과 1의 개수를 세어줘서 각각 n*n개인 것을 검사하는 방식으로 했다.

 

#include <iostream>
#include<string>

using namespace std;

int N;
int image[64][64];
int zero, one;
string s="";
void QuadTree(int x,int y,int n)
{
	//cout << s << endl;
	if (n == 0)
		return;
	zero = 0; one = 0;
	for(int i=x;i<x+n;i++)
		for (int j = y; j <y+n; j++)
		{
			if (image[i][j])
				one++;
			else
				zero++;
		}
	if (one == n * n)
	{
		s += "1";
	}
	else if (zero == n * n)
	{
		s += "0";
	}
	else
	{
		s += "(";
		QuadTree(x,y, n / 2);
		QuadTree(x, y + n / 2, n / 2);//0 4 4
		QuadTree(x + n / 2, y ,n / 2);
		QuadTree(x + n / 2, y + n / 2, n / 2);
		s += ")";


	}

}

int main()
{
	cin >> N;
	string temp;
	for (int i = 0; i < N; i++)
	{
		cin >> temp;
		for (int j = 0; j < N; j++)
		{
			image[i][j] = temp[j]-'0';
		
			
		}
	}
	//s += "(";
	QuadTree(0,0, N);
	cout << s;

}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2839설탕배달 c++  (0) 2022.05.28
[백준 ] 2042 구간합 구하기 C++  (0) 2022.05.22
[백준] 11286 절대값 힙  (0) 2022.04.13
[백준] 15829 Hashing c++  (0) 2022.04.13
[백준] 10815숫자카드 c++  (0) 2022.04.03