백준/실버

[백준] 실버1-쿼드트리 C++ 1992번

taene_ 2025. 2. 23. 13:45

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

 

1. 첫번째 답

#include <iostream>
#include <vector>
using namespace std;

int N;
vector<string> temp;

int check(int size, int startY, int startX)
{
	char k = temp[startY][startX];
	for (int i = startY; i < startY + size; i++)
	{
		for (int j = startX; j < startX + size; j++)
		{
			if (temp[i][j] != k)
				return 2;
		}
	}
	return (k - '0');
}

void recur(int size, int startY, int startX)
{
	cout << "(";
	for (int i = startY; i < startY + size; i += size / 2)
	{
		for (int j = startX; j < startX + size; j += size / 2)
		{
			int chk = check(size / 2, i, j);
			if (chk == 2)
			{
				recur(size / 2, i, j);
				cout << ")";
			}
			else
				cout << chk;
		}
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++)
	{
		string t;
		cin >> t;
		temp.push_back(t);
	}

	int answer = check(N, 0, 0);
	if (answer == 2)
	{
		recur(N, 0, 0);
		cout << ")";

	}
	else
	{
		cout << answer;
	}

	return 0;
}

 

2. 두번째 답

#include <iostream>
#include <vector>
using namespace std;

int N;
vector<string> temp;

string recur(int size, int y, int x)
{
	// if (size == 1) return string(1, temp[y][x]);
    
	string ret = "";
	char k = temp[y][x];
	for (int i = y; i < y + size; i++)
	{
		for (int j = x; j < x + size; j++)
		{
			if (k != temp[i][j])
			{
				ret += "(";
				ret += recur(size / 2, y, x);
				ret += recur(size / 2, y, x + size / 2);
				ret += recur(size / 2, y + size / 2, x);
				ret += recur(size / 2, y + size / 2, x + size / 2);
				ret += ")";
				return ret;
			}
		}
	}
	return string(1, k);
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++)
	{
		string t;
		cin >> t;
		temp.push_back(t);
	}

	cout << recur(N, 0, 0);

	return 0;
}