• toc {:toc}

📦14500: 테트로미노


[알고리즘 풀이] 강동규 Reviewed by Kade Kang (devkade12@gmail.com) Reviewed:: 2024-02-06 문제 확인하기

풀이

  • 테트로미노가 대칭, 회전하여 나올 수 있는 케이스를 나누어 적용시켰다.
  • 총 19가지 방식으로, 기준점에서 이동하는 픽셀 변화량을 blocks에 저장했다.
  • 이후, 반복문으로 모든 픽셀을 돌면서 19개의 경우를 확인한다.
  • 이때, board를 넘어서는 경우는 체크하지 않고 넘어간다.
#include <iostream>
#define endl '\n'
#define X first
#define Y second
using namespace std;
 
int n, m, board[505][505] = {};
int blocks[19][4][2] = {
    { {0, 0}, {0, 1}, {0, 2}, {0, 3}} , 
    { {0, 0}, {1, 0}, {2, 0}, {3, 0}} , 
    { {0, 0}, {1, 0}, {0, 1}, {1, 1}} , 
    { {0, 0}, {1, 0}, {2, 0}, {2, 1} },
    { {0, 0}, {0, 1}, {0, 2}, {-1, 2} },
    { {0, 0}, {0, 1}, {1, 1}, {2, 1} },
    { {0, 0}, {1, 0}, {0, 1}, {0, 2} },
    { {0, 0}, {1, 0}, {2, 0}, {2, -1} },
    { {0, 0}, {1, 0}, {1, 1}, {1, 2} },
    { {0, 0}, {0, 1}, {1, 0}, {2, 0} },
    { {0, 0}, {0, 1}, {0, 2}, {1, 2} },
    { {0, 0}, {1, 0}, {1, 1}, {2, 1} },
    { {0, 0}, {0, 1}, {-1, 1}, {-1, 2} },
    { {0, 0}, {1, 0}, {1, -1}, {2, -1} },
    { {0, 0}, {0, 1}, {1, 1}, {1, 2} },
    { {0, 0}, {0, 1}, {1, 1}, {0, 2} },
    { {0, 0}, {0, 1}, {-1, 1}, {1, 1} },
    { {0, 0}, {1, 0}, {1, -1}, {1, 1} },
    { {0, 0}, {1, 0}, {1, 1}, {2, 0} },
};
 
void Input(){
    cin >> n >> m;
    for(int row = 0; row < n; row++){
        for(int col = 0; col < m; col++){
            cin >> board[row][col];
        }
    }
}
 
bool is_inside(int row, int col){
    if (row < 0 || row >= n || col < 0 || col >= m) return false;
    return true;
}
 
int tetromino(){
    int max = 0;
    
    for(int row = 0; row < n; row++){
        for(int col = 0; col < m; col++){
            int temp = 0;
            for(int i = 0; i < 19; i++){
                if (!is_inside(row+blocks[i][2][0], col+blocks[i][2][1]) || !is_inside(row+blocks[i][3][0], col+blocks[i][3][1])) continue;
                temp = board[row+blocks[i][0][0]][col+blocks[i][0][1]] + board[row+blocks[i][1][0]][col+blocks[i][1][1]] + \
                        board[row+blocks[i][2][0]][col+blocks[i][2][1]] + board[row+blocks[i][3][0]][col+blocks[i][3][1]];
                if (temp > max) max = temp;
            }
        }
    }
    return max;
}
 
void Solution(){
    int max;
    max = tetromino();
    cout << max << endl;
}
 
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    Input();
    Solution();
 
    return 0;
}