테트로미노

링크

 

풀이

  • 브루트 포스
  • 테트리스 모양의 모든 경우의 수를 파악하고 그 경우의 수에 맞게 인덱스가 범위를 초과하지 않게 조절을 잘하면 풀 수 있다.
  • 나는 조금 무식하게 풀었다. 이중 포문을 모든 경우의 수에 해놓았는데 사실 이렇게 하지 않고, 하나의 좌표값을 받은 다음 인덱스 범위를 검사해서 가능한 경우만 헤아려주어도 괜찮음
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;
	}
}

 

Posted by doubler
,