[삼성 SW 역량 테스트] 테트로미노


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;
}





© 2020. by Andyworkingholiday

Powered by aiden