문제
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5VwAr6APYDFAWu
걸린 시간
01 : 26 : 26
풀이
C++
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#define INF 987654321
using namespace std;
int n;
int dy[4] = {1, 1, -1, -1}; // ↘ ↙ ↖ ↗
int dx[4] = {1, -1, -1, 1};
int tour(int sy, int sx, int ey, int ex, vector<vector<int>>& cafe){
int ret = -1;
int y = sy;
for(int x = sx+1; x < ex-1; x++){
set<int> s;
int ny = y;
int nx = x;
bool isValid = true;
for(int i = 0; i < 4; i++){
while(true){
if(sy > ny+dy[i] || ey <= ny+dy[i] || sx > nx+dx[i] || ex <= nx+dx[i]) break;
ny += dy[i];
nx += dx[i];
if(s.find(cafe[ny][nx]) == s.end())
s.insert(cafe[ny][nx]);
else
isValid = false;
}
}
int size = s.size();
if(isValid) ret = max(ret, size);
}
return ret;
}
int solve(vector<vector<int>>& cafe){
int ret = -1;
for(int size = 3; size <= n; size++)
for(int sy = 0; sy <= n-size; sy++)
for(int sx = 0; sx <= n-size; sx++)
ret = max(ret, tour(sy, sx, sy+size, sx+size, cafe));
return ret;
}
int main()
{
int test_case;
int T;
cin >> T;
for(test_case = 1; test_case <= T; ++test_case)
{
cin >> n;
vector<vector<int>> cafe(n, vector<int>(n, 0));
for(int y = 0; y < n; y++)
for(int x = 0; x < n; x++)
cin >> cafe[y][x];
cout << "#" << test_case << " " << solve(cafe) << "\n";
}
return 0;
}
대각선 방향으로 움직이고 사각형 모양을 그리며 출발한 카페로 돌아오는 모양은 직사각형 혹은 정사각형이지만, 크게보면 항상 커다란 정사각형 속에 존재한다. 제일 작은 정사각형(3x3)부터 제일 큰 정사각형(nxn)까지의 범위에서 가장자리를 포함한 사각형 모양의 카페 투어 경로들을 조사하면 모든 경우가 된다.
'SW Expert Academy' 카테고리의 다른 글
SW Expert Academy 2115. 벌꿀채취 (0) | 2020.11.08 |
---|---|
SW Expert Academy 5656. 벽돌 깨기 (0) | 2020.11.03 |
SW Expert Academy 1952. 수영장 (0) | 2020.11.02 |
SW Expert Academy 5644. 무선 충전 (0) | 2020.11.02 |
댓글