백준 14500, 테트로미노

jeong seok ha·2022년 4월 24일
0

코테 문제풀이

목록 보기
15/39

문제

https://www.acmicpc.net/problem/14500

풀이

그냥 무지성으로 모든 회전, 대칭을 고려한 테트리스 블록을 구현하고 모든 부분에 적용시켜서 푸는 방식으로 진행했다. 다만 이렇게 하니까 오류 날 확률도 높고 시간도 오래걸려서 다음에는 회전, 대칭은 하드 코딩하지 않고 진행하는 방식으로 해야할 것 같다.

실수

  • 중간중간 코드 작성 실수
  • 시간 오래 걸림 (1시간)

코드


#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<vector>
#include<utility>

using namespace std;

int n, m;
int result = 0;
int temp_result = 0;
vector<vector<int>> matrix(550, vector<int>(550, 0));
vector<vector<pair<int, int>>> I_mino(2, vector<pair<int, int>>(4, make_pair(0, 0)));
vector<vector<pair<int, int>>> O_mino(1, vector<pair<int, int>>(4, make_pair(0, 0)));
vector<vector<pair<int, int>>> Z_mino(4, vector<pair<int, int>>(4, make_pair(0, 0)));
vector<vector<pair<int, int>>> J_mino(8, vector<pair<int, int>>(4, make_pair(0, 0)));
vector<vector<pair<int, int>>> T_mino(4, vector<pair<int, int>>(4, make_pair(0, 0)));

int main() {

	// 노가다로 모든 경우의수 구해주기
	I_mino[0][0] = make_pair(0, 0);
	I_mino[0][1] = make_pair(0, 1);
	I_mino[0][2] = make_pair(0, 2);
	I_mino[0][3] = make_pair(0, 3);

	I_mino[1][0] = make_pair(0, 0);
	I_mino[1][1] = make_pair(1, 0);
	I_mino[1][2] = make_pair(2, 0);
	I_mino[1][3] = make_pair(3, 0);

	O_mino[0][0] = make_pair(0, 0);
	O_mino[0][1] = make_pair(0, 1);
	O_mino[0][2] = make_pair(1, 0);
	O_mino[0][3] = make_pair(1, 1);

	Z_mino[0][0] = make_pair(0, 0);
	Z_mino[0][1] = make_pair(0, 1);
	Z_mino[0][2] = make_pair(1, 1);
	Z_mino[0][3] = make_pair(1, 2);

	Z_mino[1][0] = make_pair(0, 0);
	Z_mino[1][1] = make_pair(1, 0);
	Z_mino[1][2] = make_pair(1, -1);
	Z_mino[1][3] = make_pair(2, -1);

	Z_mino[2][0] = make_pair(0, 0);
	Z_mino[2][1] = make_pair(0, 1);
	Z_mino[2][2] = make_pair(-1, 1);
	Z_mino[2][3] = make_pair(-1, 2);

	Z_mino[3][0] = make_pair(0, 0);
	Z_mino[3][1] = make_pair(-1, 0);
	Z_mino[3][2] = make_pair(-1, -1);
	Z_mino[3][3] = make_pair(-2, -1);

	J_mino[0][0] = make_pair(0, 0);
	J_mino[0][1] = make_pair(0, 1);
	J_mino[0][2] = make_pair(0, 2);
	J_mino[0][3] = make_pair(1, 2);

	J_mino[1][0] = make_pair(0, 0);
	J_mino[1][1] = make_pair(0, 1);
	J_mino[1][2] = make_pair(0, 2);
	J_mino[1][3] = make_pair(-1, 2);

	J_mino[2][0] = make_pair(0, 0);
	J_mino[2][1] = make_pair(0, 1);
	J_mino[2][2] = make_pair(0, 2);
	J_mino[2][3] = make_pair(1, 0);

	J_mino[3][0] = make_pair(0, 0);
	J_mino[3][1] = make_pair(0, 1);
	J_mino[3][2] = make_pair(0, 2);
	J_mino[3][3] = make_pair(-1, 0);

	J_mino[4][0] = make_pair(0, 0);
	J_mino[4][1] = make_pair(1, 0);
	J_mino[4][2] = make_pair(2, 0);
	J_mino[4][3] = make_pair(2, 1);

	J_mino[5][0] = make_pair(0, 0);
	J_mino[5][1] = make_pair(1, 0);
	J_mino[5][2] = make_pair(2, 0);
	J_mino[5][3] = make_pair(2, -1);

	J_mino[6][0] = make_pair(0, 0);
	J_mino[6][1] = make_pair(1, 0);
	J_mino[6][2] = make_pair(2, 0);
	J_mino[6][3] = make_pair(0, 1);

	J_mino[7][0] = make_pair(0, 0);
	J_mino[7][1] = make_pair(1, 0);
	J_mino[7][2] = make_pair(2, 0);
	J_mino[7][3] = make_pair(0, -1);

	T_mino[0][0] = make_pair(0, 0);
	T_mino[0][1] = make_pair(1, 0);
	T_mino[0][2] = make_pair(2, 0);
	T_mino[0][3] = make_pair(1, 1);
	
	T_mino[1][0] = make_pair(0, 0);
	T_mino[1][1] = make_pair(1, 0);
	T_mino[1][2] = make_pair(2, 0);
	T_mino[1][3] = make_pair(1, -1);

	T_mino[2][0] = make_pair(0, 0);
	T_mino[2][1] = make_pair(0, 1);
	T_mino[2][2] = make_pair(0, 2);
	T_mino[2][3] = make_pair(1, 1);

	T_mino[3][0] = make_pair(0, 0);
	T_mino[3][1] = make_pair(0, 1);
	T_mino[3][2] = make_pair(0, 2);
	T_mino[3][3] = make_pair(-1, 1);

	scanf("%d %d", &n, &m);

	for (int i = 1; i <= n; i++) {

		for (int j = 1; j <= m; j++) {

			scanf(" %d", &matrix[i][j]);

		}

	}

	for (int i = 1; i <= n; i++) { // 특정 위치에서

		for (int j = 1; j <= m; j++) {

			for (int k = 0; k < I_mino.size(); k++) { // 각 미노 확인 I

				temp_result = 0; // 초기화

				for (int l = 0; l < I_mino[k].size(); l++) { // L 임

					// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인

					int x = i + I_mino[k][l].first;
					int y = j + I_mino[k][l].second;

					if (1 <= x && x <= n) {

						if (1 <= y && y <= m) {

							temp_result += matrix[x][y];

							if (l == I_mino[k].size() - 1) {

								result = max(temp_result, result);

							}

							else {

								continue; // 맞으면 지속

							}
								
						}

					}

					break; // 아니면 탈출

				}

			}

			for (int k = 0; k < O_mino.size(); k++) { // 각 미노 확인 O

				temp_result = 0; // 초기화

				for (int l = 0; l < O_mino[k].size(); l++) { // L 임

					// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인

					int x = i + O_mino[k][l].first;
					int y = j + O_mino[k][l].second;

					if (1 <= x && x <= n) {

						if (1 <= y && y <= m) {

							temp_result += matrix[x][y];

							if (l == O_mino[k].size() - 1) {

								result = max(temp_result, result);

							}

							else {

								continue; // 맞으면 지속

							}

						}

					}

					break; // 아니면 탈출

				}

			}

			for (int k = 0; k < Z_mino.size(); k++) { // 각 미노 확인 Z

				temp_result = 0; // 초기화

				for (int l = 0; l < Z_mino[k].size(); l++) { // L 임

					// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인

					int x = i + Z_mino[k][l].first;
					int y = j + Z_mino[k][l].second;

					if (1 <= x && x <= n) {

						if (1 <= y && y <= m) {

							temp_result += matrix[x][y];

							if (l == Z_mino[k].size() - 1) {

								result = max(temp_result, result);

							}

							else {

								continue; // 맞으면 지속

							}

						}

					}

					break; // 아니면 탈출

				}

			}

			for (int k = 0; k < J_mino.size(); k++) { // 각 미노 확인 J

				temp_result = 0; // 초기화

				for (int l = 0; l < J_mino[k].size(); l++) { // L 임

					// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인

					int x = i + J_mino[k][l].first;
					int y = j + J_mino[k][l].second;

					if (1 <= x && x <= n) {

						if (1 <= y && y <= m) {

							temp_result += matrix[x][y];

							if (l == J_mino[k].size() - 1) {

								result = max(temp_result, result);

							}

							else {

								continue; // 맞으면 지속

							}

						}

					}

					break; // 아니면 탈출

				}

			}

			for (int k = 0; k < T_mino.size(); k++) { // 각 미노 확인 T

				temp_result = 0; // 초기화

				for (int l = 0; l < T_mino[k].size(); l++) { // L 임

					// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인

					int x = i + T_mino[k][l].first;
					int y = j + T_mino[k][l].second;

					if (1 <= x && x <= n) {

						if (1 <= y && y <= m) {

							temp_result += matrix[x][y];

							if (l == T_mino[k].size() - 1) {

								result = max(temp_result, result);

							}

							else {

								continue; // 맞으면 지속

							}

						}

					}

					break; // 아니면 탈출

				}

			}

		}

	}

	printf("%d", result);


}
profile
기록용 블로그

0개의 댓글

관련 채용 정보