본문 바로가기
알고리즘/백준

[백준 14500] 테트로미노 (C++)

by Bloofer 2020. 4. 12.

A. 문제설명

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

문제에 대한 자세한 설명은 링크 참조

 

1. N * M 크기의 배열이 존재

2. 배열 위에 5개 종류의 테트리스 도형(테트로미노) 하나를 놓으려고 함

3. 테트로미노는 회전하거나 대칭시킬 수 있다. 

4. 각 배열에 엔트리에 숫자 값이 존재하는 데 특정 위치에 이 테트로미노 하나를 놓아 최대의 합을 갖게 하는 경우 출력

 

B. 접근법

완전탐색과 시뮬레이션

먼저 이 문제에 대해 접근하려면 A. 문제설명의 3번 조건을 고려하여야 한다. 나의 경우 테트로미노의 4방향 회전과 대칭된 도형의 모양을 고려하여 구현하였고,

매 좌표를 탐사할 때 위와 같이 각각의 테트로미노 도형에 대해서 4방향을 회전한 경우의 영역의 엔트리 값의 합을 계산한다. 계산된 값이 최대일 때마다 전역의 값에 업데이트하는 방식이다.

C. 풀이

1. N*M 배열을 모두 탐사하며 각 좌표에 대해 놓을 수 있는 도형의 숫자 합을 구함

2. 도형의 모양은 아래와 같이 표현할 수 있다.

string shape[7] = {"000", "012", "100", "300", "010", "030", "004"};

   2-1. 여기서 shape[2]/[3]과 shape[4]/[5]는 대칭된 모양의 같은 도형이다.

   2-2. 도형의 모양은 각 좌표에서 이동하는 방향으로 표현할 수 있는데,

   2-3. 0:→, 1:↓, 2:←, 3:↑, 4:↙, 5:↖, 6:↗, 7:↘를 의미한다.

3. 각 도형을 회전시키는 경우는 아래와 같이 표현할 수 있다.
string dir[7] = {"01", "0", "0123", "0123", "01", "01", "0123"};

   3-1. 여기서 0:→, 1:↓, 2:←, 3:↑을 의미하고,

   3-2. 각 도형별로 중복되는 회전의 경우는 제외했다.

4. 모양과 각도에 따라 배열내 숫자 값을 가져오게 되고 도형이 배열의 범위를 벗어나는 경우는 제외함

5. 완전 탐색하여 그 중 최대의 Sum 값을 반환

 

D. 내 코드