알고리즘, 코딩테스트
백준 14500번(테트로미노) c++ 풀이
552bin
2025. 3. 19. 04:23
https://www.acmicpc.net/problem/14500
테트로미노 5가지. 회전, 대칭시킨 것도 고려해야 한다.
테트로미노는 블럭 4개로 이루어져있고 종류도 5개라서 그냥 dx dy로 하드코딩했다..
4개 이상으로 만든 폴리오미노 문제가 있다면 이 방법은 번거로울 것 같다.
근데 뭐.. 이건 되니깐
테트로미노를 이리저리 회전, 대칭 시키는 것보다 보드를 움직이는 게 더 쉬울 것 같았다.
검은 점이 0, 0이라고 생각하면 보드는 회전/대칭하여 총 8가지의 형태가 가능
원본 배열을 이리저리 조작해서 새로 만드는 것보다 입력받을 때 채워넣었다..
나머지는 뭐 단순연산이니까..
#include <iostream>
using namespace std;
int n, m;
int board[8][500][500];
int ans;
// 테트로미노
int tdx[5][4] = {
{0, 0, 0, 0},
{0, 0, 1, 1},
{0, 1, 2, 2},
{0, 1, 1, 2},
{0, 0, 0, 1},
};
int tdy[5][4] = {
{0, 1, 2, 3},
{0, 1, 0, 1},
{0, 0, 0, 1},
{0, 0, 1, 1},
{0, 1, 2, 1},
};
int findMax(int bIdx, int tIdx){
int xLimit = (bIdx < 4 ? n : m);
int yLimit = (bIdx < 4 ? m : n);
int maxValue = -1;
for(int i=0; i<xLimit; i++){
for(int j=0; j<yLimit; j++){
int sum = 0;
bool ok = true;
for(int k=0; k<4; k++){
int currX = i + tdx[tIdx][k];
int currY = j + tdy[tIdx][k];
if(currX < 0 || currX >= xLimit || currY < 0 || currY >= yLimit){
ok = false;
break;
}
sum += board[bIdx][currX][currY];
}
if(!ok) continue;
maxValue = max(maxValue, sum);
}
}
return maxValue;
}
void solve(){
for(int i=0; i<8; i++){
for(int j=0; j<5; j++){
ans = max(ans, findMax(i, j));
}
}
return;
}
int main(){
cin >> n >> m;
int num;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin >> num;
board[0][i][j] = num;
board[1][i][m - 1 - j] = num;
board[2][n - 1 - i][j] = num;
board[3][n - 1 - i][m - 1 - j] = num;
board[4][j][i] = num;
board[5][j][n - 1 - i] = num;
board[6][m - 1 - j][i] = num;
board[7][m - 1 - j][n - 1 - i] = num;
}
}
solve();
cout << ans;
return 0;
}