[삼성 SW 역량 테스트] 테트로미노
in Coding Test on 삼성 역량테스트
Na982 선생님의 풀이이다.
블록이 가질 수 있는 모든 그림을 char 배열에 그려주었다.
그러면 문제를 쉽게 접근할 수 있다.
Code
#include <iostream>
#include <algorithm>
using namespace std;
int n, m;
int map[503][503];
const char block[19][4][5] = {
{
"1111",
"0000",
"0000",
"0000",
},
{
"1000",
"1000",
"1000",
"1000",
},
{
"1100",
"1100",
"0000",
"0000",
},
{
"1000",
"1000",
"1100",
"0000",
},
{
"1100",
"0100",
"0100",
"0000",
},
{
"1110",
"1000",
"0000",
"0000",
},
{
"0010",
"1110",
"0000",
"0000",
},
{
"0100",
"0100",
"1100",
"0000",
},
{
"1000",
"1110",
"0000",
"0000",
},
{
"1100",
"1000",
"1000",
"0000",
},
{
"1110",
"0010",
"0000",
"0000",
},
{
"1000",
"1100",
"0100",
"0000",
},
{
"0110",
"1100",
"0000",
"0000",
},
{
"0100",
"1100",
"1000",
"0000",
},
{
"1100",
"0110",
"0000",
"0000",
},
{
"1000",
"1100",
"1000",
"0000",
},
{
"1110",
"0100",
"0000",
"0000",
},
{
"0100",
"1100",
"0100",
"0000",
},
{
"0100",
"1110",
"0000",
"0000",
},
};
int get_count(int y, int x, int k) {
int ret = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
ret += (block[k][i][j] - '0') * map[y + i][x + j];
}
}
return ret;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &map[i][j]);
}
}
for (int i = n; i < n + 3; i++) {
for (int j = 0; j < m + 3; j++) {
map[i][j] = -5000;
}
}
for (int i = 0; i < n + 3; i++) {
for (int j = m; j < m + 3; j++) {
map[i][j] = -5000;
}
}
int ret = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
for (int k = 0; k < 19; k++) {
int candi = get_count(i, j, k);
if (ret < candi) ret = candi;
}
}
}
printf("%d\n", ret);
return 0;
}