본문 바로가기
algorithm/SW Expert Academy

[모의 SW 역량테스트] 디저트 카페 - 2105

by 에어컨조아 2020. 1. 7.

문제 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5VwAr6APYDFAWu

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

코드 : 

#include <iostream>
#include <unordered_set>

using namespace std;

int N;
int num[20][20] = { 0 };
int maxValue = 0;

bool Arround_arr(int i, int j)
{
	if ((i < 0 || i >= N) || (j < 0 || j >= N))
		return false;
	return true;
}

void solution(int i, int j)
{
	unordered_set<int> temp;
	//좌하단
	for (int n = 1; n <= j; n++)
	{
		int c = i + n;
		//우하단
		for (int m = 1; m <= N - c; m++)
		{
			temp.clear();
			int count = 2 * (n + m);
			if (maxValue > count)
			{
				continue;
			}
			bool failCheck = false;

			//좌하단
			int lby = 0;
			int lbx = 0;
			for (int k = 1; k <= n; k++)
			{
				lby = i + k;
				lbx = j - k;
				if (Arround_arr(lby, lbx) == false)
				{
					failCheck = true;
					break;
				}
				auto v = temp.insert(num[i + k][j - k]);
				if (v.second == false)
				{
					failCheck = true;
					break;
				}
			}
			if (failCheck)
				continue;

			//우하단
			int rby = 0;
			int rbx = 0;
			for (int k = 1; k <= m; k++)
			{
				rby = lby + k;
				rbx = lbx + k;
				if (Arround_arr(rby, rbx) == false)
				{
					failCheck = true;
					break;
				}
				auto v = temp.insert(num[rby][rbx]);
				if (v.second == false)
				{
					failCheck = true;
					break;
				}
			}
			if (failCheck)
				continue;

			//우상단
			int rty = 0;
			int rtx = 0;
			for (int k = 1; k <= n; k++)
			{
				rty = rby - k;
				rtx = rbx + k;
				if (Arround_arr(rty, rtx) == false)
				{
					failCheck = true;
					break;
				}
				auto v = temp.insert(num[rty][rtx]);
				if (v.second == false)
				{
					failCheck = true;
					break;
				}
			}
			if (failCheck)
				continue;

			//좌상단
			int lty = 0;
			int ltx = 0;
			for (int k = 1; k <= m; k++)
			{
				int lty = rty - k;
				int ltx = rtx - k;
				if (Arround_arr(lty, ltx) == false)
				{
					failCheck = true;
					break;
				}
				auto v = temp.insert(num[lty][ltx]);
				if (v.second == false)
				{
					failCheck = true;
					break;
				}
			}
			if (failCheck)
				continue;

			if (failCheck == false)
				maxValue = count;
		}
	}
}

int main()
{
	int count = 1;
	int loop = 0;

	cin >> loop;

	while (count <= loop)
	{
		cin >> N;

		maxValue = 0;
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				cin >> num[i][j];
			}
		}
		for (int i = 0; i < N; i++)
		{
			for (int j = 1; j < N - 1; j++)
			{

				solution(i, j);
			}
		}
		if (maxValue == 0)
		{
			maxValue = -1;
		}
		cout << "#" << count << " " << maxValue << "\n";
		
		count++;

	}

	return 0;
}

 

재귀로 풀 수 있을꺼 같아 시도했지만 실패한 문제..

방향에 따른 노가다성 구현을 해야했다.. 

댓글