테트로미노
풀이
- 브루트 포스
- 테트리스 모양의 모든 경우의 수를 파악하고 그 경우의 수에 맞게 인덱스가 범위를 초과하지 않게 조절을 잘하면 풀 수 있다.
- 나는 조금 무식하게 풀었다. 이중 포문을 모든 경우의 수에 해놓았는데 사실 이렇게 하지 않고, 하나의 좌표값을 받은 다음 인덱스 범위를 검사해서 가능한 경우만 헤아려주어도 괜찮음
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static InputStreamReader isr;
static BufferedReader br;
static OutputStreamWriter osw;
static BufferedWriter bw;
static StringTokenizer st;
static int[][]array = null;
public static void main(String[] args) throws IOException {
isr = new InputStreamReader(System.in);
br = new BufferedReader(isr);
osw = new OutputStreamWriter(System.out);
bw = new BufferedWriter(osw);
st = new StringTokenizer(br.readLine());
int rows = Integer.parseInt(st.nextToken());
int cols = Integer.parseInt(st.nextToken());
array = new int[rows][cols];
for(int r = 0; r < rows; r++) {
st = new StringTokenizer(br.readLine());
for(int c = 0; c < cols; c++) {
array[r][c] = Integer.parseInt(st.nextToken());
}
}
int resultValue = getMaxValueByFirstMethod();
resultValue = Math.max(resultValue, getMaxValueBySecondMethod());
resultValue = Math.max(resultValue, getMaxValueByThirdMethod());
resultValue = Math.max(resultValue, getMaxValueByForthMethod());
resultValue = Math.max(resultValue, getMaxValueByFifthMethod());
bw.write(resultValue + "\n");
bw.flush();
bw.close();
br.close();
}
/** 정사각형 **/
private static int getMaxValueByFirstMethod() {
int max = -1;
for(int r = 0; r < array.length - 1; r++) {
for(int c = 0; c < array[r].length - 1; c++) {
int value1 = array[r][c];
int value2 = array[r][c+1];
int value3 = array[r+1][c];
int value4 = array[r+1][c+1];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
return max;
}
/** 막대기 **/
private static int getMaxValueBySecondMethod() {
int max = -1;
/** 가로 **/
for(int r = 0; r < array.length; r++) {
for(int c = 0; c < array[r].length - 3; c++) {
int value1 = array[r][c];
int value2 = array[r][c+1];
int value3 = array[r][c+2];
int value4 = array[r][c+3];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
/** 세로 **/
for(int r = 0; r < array.length - 3; r++) {
for(int c = 0; c < array[r].length; c++) {
int value1 = array[r][c];
int value2 = array[r+1][c];
int value3 = array[r+2][c];
int value4 = array[r+3][c];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
return max;
}
/** 기역자 **/
private static int getMaxValueByThirdMethod() {
int max = -1;
for(int r = 0; r < array.length - 2; r++) {
/** 니은 **/
for(int c = 0; c < array[r].length - 1; c++) {
int value1 = array[r][c];
int value2 = array[r+1][c];
int value3 = array[r+2][c];
int value4 = array[r+2][c+1];
max = Math.max(max, value1 + value2 + value3 + value4);
value1 = array[r+2][c];
value2 = array[r][c+1];
value3 = array[r+1][c+1];
value4 = array[r+2][c+1];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
/** 니은을 반시계 방향으로 돌림 **/
for(int r = 1; r < array.length; r++) {
for(int c = 0; c < array[r].length - 2; c++) {
int value1 = array[r][c];
int value2 = array[r][c+1];
int value3 = array[r][c+2];
int value4 = array[r-1][c+2];
max = Math.max(max, value1 + value2 + value3 + value4);
value1 = array[r][c];
value2 = array[r-1][c];
value3 = array[r][c+1];
value4 = array[r][c+2];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
/** 기역 **/
for(int r = 0; r < array.length - 2; r++) {
for(int c = 0; c < array[r].length - 1; c++) {
int value1 = array[r][c];
int value2 = array[r][c+1];
int value3 = array[r+1][c+1];
int value4 = array[r+2][c+1];
max = Math.max(max, value1 + value2 + value3 + value4);
value1 = array[r][c];
value2 = array[r+1][c];
value3 = array[r+2][c];
value4 = array[r][c+1];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
/** 기역을 반시게 방향으로 돌림 **/
for(int r = 0; r < array.length - 1; r++) {
for(int c = 0; c < array[r].length - 2; c++) {
int value1 = array[r][c];
int value2 = array[r][c+1];
int value3 = array[r][c+2];
int value4 = array[r+1][c];
max = Math.max(max, value1 + value2 + value3 + value4);
value1 = array[r][c];
value2 = array[r][c+1];
value3 = array[r][c+2];
value4 = array[r+1][c+2];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
return max;
}
/** 꺽은선 **/
private static int getMaxValueByForthMethod() {
int max = -1;
for(int r = 0; r < array.length - 2; r++) {
for(int c = 0; c < array[r].length - 1; c++) {
int value1 = array[r][c];
int value2 = array[r+1][c];
int value3 = array[r+1][c+1];
int value4 = array[r+2][c+1];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
for(int r = 1; r < array.length; r++) {
for(int c = 0; c < array[r].length - 2; c++) {
int value1 = array[r][c];
int value2 = array[r][c+1];
int value3 = array[r-1][c+1];
int value4 = array[r-1][c+2];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
for(int r = 0; r < array.length - 2; r++) {
for(int c = 1; c < array[r].length; c++) {
int value1 = array[r][c];
int value2 = array[r+1][c];
int value3 = array[r+1][c-1];
int value4 = array[r+2][c-1];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
for(int r = 0; r < array.length - 1; r++) {
for(int c = 0; c < array[r].length - 2; c++) {
int value1 = array[r][c];
int value2 = array[r][c+1];
int value3 = array[r+1][c+1];
int value4 = array[r+1][c+2];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
return max;
}
/** 산봉우리 **/
private static int getMaxValueByFifthMethod() {
int max = -1;
for(int r = 0; r < array.length - 2; r++) {
for(int c = 0; c < array[r].length - 1; c++) {
int value1 = array[r][c];
int value2 = array[r+1][c];
int value3 = array[r+2][c];
int value4 = array[r+1][c+1];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
for(int r = 0; r < array.length - 1; r++) {
for(int c = 0; c < array[r].length - 2; c++) {
int value1 = array[r][c];
int value2 = array[r][c+1];
int value3 = array[r][c+2];
int value4 = array[r+1][c+1];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
for(int r = 0; r < array.length - 2; r++) {
for(int c = 1; c < array[r].length; c++) {
int value1 = array[r][c];
int value2 = array[r+1][c];
int value3 = array[r+2][c];
int value4 = array[r+1][c-1];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
for(int r = 1; r < array.length; r++) {
for(int c = 0; c < array[r].length - 2; c++) {
int value1 = array[r][c];
int value2 = array[r][c+1];
int value3 = array[r][c+2];
int value4 = array[r-1][c+1];
max = Math.max(max, value1 + value2 + value3 + value4);
}
}
return max;
}
}
'Problem Solving & Algorithm > BOJ ' 카테고리의 다른 글
20190405 14891번 : 톱니바퀴 (0) | 2019.04.05 |
---|---|
20190401 1197번 : 최소 스패닝 트리 (0) | 2019.04.02 |
20190309 1922번 : 네트워크 연결 (0) | 2019.03.09 |
20190301 10819번 : 차이를 최대로 (수정 : 20190309) (0) | 2019.03.01 |
20190301 11722번 : 가장 긴 감소하는 부분 수열 (0) | 2019.03.01 |