알고리즘
[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();
}
}