가로의 측면으로 봤을때 m의 범위까지 만들수 있는 도형은 3개를 만들 수 있습니다.
따라서 m의 범위에 만족하는 j개수를 찾아야하는데 2,3,4의 경우가 됩니다. 이것이 어떤 말이냐하면 j의값을 몇으로 둬야지 해당 m의 범위까지 만족할 수 있는지를 찾아낼 수 있습니다.
j+2 < m 의 경우를 살펴보면, 0+2 < 5, 1+2 < 5, 2+2 < 5의 경우가 되니까 해당 가로로 되는 경우의 수를 찾을 수 있게 됩니다.
세로의측면
세로의 측면에서 봤을때 n의 범위까지 만들 수 있는 도형은 4개가 됩니다.
따라서 n의 범위를 만족하는 i의 개수를 찾아야하는데 1,2,3,4의 경우를 들 수 있습니다.
i+1 < n 의 경우를 살펴보면 0+1 < 5, 1+1 < 5, 2+1 < 5, 3+1 < 5 의 총 4가지 경우가 발생합니다.
이제 이렇게 모든 19개의 경우를 찾아준 후 Math.max함수를 사용하여 해당되는 범위를 구해줄 수 있습니다.
위의 예시를 구해보면 Math.max(비교값, board[i][j+1] + board[i][j+2] + board[i+1][j] + board[i+1][j+1]) 의 경우로 해당 값들을 갱신해 나갈 수 있습니다.
따라서 이것을 점화식으로 해당되는 도형마다 모든 경우의 수를 찾아주게 되면 완전탐색을 진행할 수 있습니다.
publicclass 테트로미노_14500번 { publicstaticvoidmain(String[] args)throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken());
//==입력==// int[][] map = newint[n][m]; 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()); } }