문제 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5VwAr6APYDFAWu
코드 :
#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;
}
재귀로 풀 수 있을꺼 같아 시도했지만 실패한 문제..
방향에 따른 노가다성 구현을 해야했다..
'algorithm > SW Expert Academy' 카테고리의 다른 글
[1차원 배열 연습 문제] View - 1206 (0) | 2020.01.08 |
---|---|
[1차원 배열 연습 문제] 최빈수 구하기 - 1204 (0) | 2020.01.08 |
[모의 SW 역량테스트] 점심 식사시간- 2383 (0) | 2019.12.28 |
[모의 SW 역량테스트] 등산로 조성 - 1949 (0) | 2019.12.23 |
[모의 SW 역량테스트] 벌꿀채취 - 2115 (0) | 2019.12.19 |
댓글