알고리즘

[Java] 백준 14500번 테트로미노

J3SUNG 2023. 2. 9. 21:41
728x90

여러가지 테트리스 도형들 중 하나를 선택해서 사각형에 두어서 가장 큰 점수를 얻는 문제입니다.

도형은 대칭 회전이 가능하며 총 19가지의 경우의 수가 나옵니다.
직선 도형 = 2개 (가로, 세로)
사각형 = 1개
L도형 = 8개
N도형 = 4개
T도형 = 4개

각 도형이 가지는 크기는 아래와 같습니다.
직선 가로 = x+3
직선 세로 = y+3
사각형 = x+1, y+1
L, N, T = x+1, y+2
L, N, T = x+2, y+1

직선과 사각형은 각각 한개이므로 if문에 넣어주었으며
L,N,T는 x+1,y+2와 x+2,y+1에 따라서 각각 배열에 넣어서 반복문을 통해서 탐색해주었습니다.

도형이 사각형 밖을 나가지 않게 예외처리를 해준 다음 도형을 대입했을 때 가장 큰값을 출력해주었습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		int max = 0;
		int[][] map = new int[n][m];
		int[][] figy3 = {{0,0}, {1,0}, {2,0}, {3,0}}; 	//세로 직선, y+3 
		int[][] figx3 = {{0,0}, {0,1}, {0,2}, {0,3}}; 	//가로직선, x+3
		int[][] figy1x1 = {{0,0}, {0,1}, {1,0}, {1,1}};	//사각형, x+1, y+1
		int[][][] figy2x1 = {	//L, N, T, x+1, y+2 
				{{0,0}, {1,0}, {2,0}, {0,1}},	//L
				{{0,1}, {1,1}, {2,1}, {0,0}},
				{{0,0}, {1,0}, {2,0}, {2,1}},
				{{0,1}, {1,1}, {2,1}, {2,0}},
				{{0,0}, {1,0}, {1,1}, {2,1}},	//N
				{{0,1}, {1,0}, {1,1}, {2,0}},		
				{{0,0}, {1,0}, {2,0}, {1,1}},	//T
				{{0,1}, {1,1}, {2,1}, {1,0}}
		}; 
		int[][][] figy1x2 = { //L, N, T, x+2, y+1
				{{0,0}, {0,1}, {0,2}, {1,2}},	//L
				{{1,0}, {1,1}, {1,2}, {0,2}},
				{{0,0}, {0,1}, {0,2}, {1,0}},
				{{1,0}, {1,1}, {1,2}, {0,0}},
				{{1,0}, {1,1}, {0,1}, {0,2}},	//N
				{{0,0}, {0,1}, {1,1}, {1,2}},
				{{0,0}, {0,1}, {0,2}, {1,1}},	//T
				{{1,0}, {1,1}, {1,2}, {0,1}}
		}; 
		for(int i=0; i<n; ++i) {
			st = new StringTokenizer(br.readLine());
			for(int j=0; j<m; ++j) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		for(int i=0; i<n; ++i) {
			for(int j=0; j<m; ++j) {
				int sum;
				if(i+3 < n) { //y+3
					sum = 0;
					for(int k=0; k<4; ++k) { 
						sum += map[i+figy3[k][0]][j+figy3[k][1]];
					}
					max = Math.max(max, sum);
				}
				if(j+3 < m) {	//x+3
					sum = 0;
					for(int k=0; k<4; ++k) { 
						sum += map[i+figx3[k][0]][j+figx3[k][1]];
					}
					max = Math.max(max, sum);
				}
				if(i+1 < n && j+1 < m) { //square
					sum = 0;
					for(int k=0; k<4; ++k) {
						sum += map[i+figy1x1[k][0]][j+figy1x1[k][1]];
					}
					max = Math.max(max, sum);
				}
				if(i+2 < n && j+1 < m) { //L, N, T, x+1 y+2 
					for(int k=0; k<8; ++k) {
						sum = 0;
						for(int l=0; l<4; ++l) {
							sum += map[i+figy2x1[k][l][0]][j+figy2x1[k][l][1]];
						}
						max = Math.max(max, sum);
					}
				}
				if(i+1 < n && j+2 < m) { //L, N, T, x+2, y+1
					for(int k=0; k<8; ++k) {
						sum = 0;
						for(int l=0; l<4; ++l) {
							sum += map[i+figy1x2[k][l][0]][j+figy1x2[k][l][1]];
						}
						max = Math.max(max, sum);
						if(max == 21)
						{
							System.out.println(k);
						}
					}
				}
			}
		}
		bw.write(max + "");
		bw.close();
	}
}