알고리즘

[백준, 자바, 14500번] 테트로미노

hminor 2024. 12. 16. 16:02
반응형

풀이

  • 해당 문제는 어떻게 푸는 방법이 좋을지 고민했을 때
  • 각 도형에 따른 변형을 최소화하면서, 기준 좌표로부터
  • 이동가능한 좌표 탐색을 4방향을 우선적으로 작성 후 값을 도출하는 것이 좋을 것 같다고 판단.
  • 다만, 이러한 노가다가 과연 적절한지 고민해봤는데 나쁘지 않을 듯해서 아래와 같이 작성
  • 그리고 무슨 5중 for문으로 해결한 문제는 이번이 처음인듯...
  • 그래도 최대한 코드를 가독성 좋으며, 구조적으로 작성하려고 노력하여 아래와 같이 작성.
  • 문제 자체는 크게 어려운 건 아니지만, 번거로웠다? 정도였음.

 

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class _14500 {
    static BufferedReader br;
    static StringTokenizer st;
    static int[][][][] li;
    static int[][] mtx;
    static int N;
    static int M;
    static int result = 0;
    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        li = new int[5][][][];
        addDefault();
        findTetro();
        System.out.println(result);
    }

    private static void addDefault() throws IOException {
        li[0] = new int[][][] {
                {{0, 0}, {0, 1}, {0, 2}, {0, 3}},
                {{0, 0}, {1, 0}, {2, 0}, {3, 0}}
        };
        li[1] = new int[][][] {
                {{0, 0}, {0, 1}, {1, 1}, {1, 0}}
        };
        li[2] = new int[][][] {
                {{0, -1}, {0, 0}, {0, 1}, {1, 0}},
                {{0, -1}, {0, 0}, {-1, 0}, {1, 0}},
                {{0, -1}, {0, 0}, {-1, 0}, {0, 1}},
                {{-1, 0}, {0, 0}, {0, 1}, {1, 0}}
        };
        li[3] = new int[][][] {
                {{0, 0}, {1, 0}, {1, 1}, {2, 1}},
                {{0, 0}, {1, 0}, {1, -1}, {2, -1}},
                {{0, 0}, {0, 1}, {-1, 1}, {-1, 2}},
                {{0, 0}, {0, 1}, {1, 1}, {1, 2}}
        };
        li[4] = new int[][][] {
                {{0, 0}, {1, 0}, {2, 0}, {2, 1}},
                {{0, 0}, {1, 0}, {2, 0}, {2, -1}},
                {{0, 0}, {1, 0}, {0, 1}, {0, 2}},
                {{0, 0}, {1, 0}, {0, -1}, {0, -2}},
                {{0, 0}, {0, 1}, {1, 1}, {2, 1}},
                {{0, 0}, {0, -1}, {1, -1}, {2, -1}},
                {{0, 0}, {-1, 0}, {0, -1}, {0, -2}},
                {{0, 0}, {-1, 0}, {0, 1}, {0, 2}}
        };

        mtx = new int[N][M];
        for (int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j=0; j<M; j++) mtx[i][j] = Integer.parseInt(st.nextToken());
        }
    }

    private static void findTetro() {
        for (int i=0; i<N; i++) {
            for (int j=0; j<M; j++) {
                detailTetro(i,j);
            }
        }
    }

    private static void detailTetro(int i, int j) {
        for (int t=0; t<5; t++) { // 각 도형
            for (int x=0; x<li[t].length; x++) { // 도형 별 회전&대칭
                boolean state = true;
                int hap = 0;
                for (int y=0; y<4; y++) {
                    if ((0<=i+li[t][x][y][0]&&i+li[t][x][y][0]<N)&&(0<=j+li[t][x][y][1]&&j+li[t][x][y][1]<M)) hap+=mtx[i+li[t][x][y][0]][j+li[t][x][y][1]];
                    else {
                        state = false;
                        break;
                    }
                }
                if (state&&hap>result) result = hap;
            }
        }
    }
}