[백준 / 골드4] 14500 테트로미노 (Java)

wannabeking·2022년 12월 22일
0

코딩테스트

목록 보기
149/155

문제 보기



사용한 것

  • 현재 인덱스에서 특정 모양을 사용할 때 최대 크기를 구하는 findCurMax()


풀이 방법

  • 2중 for 문으로 map을 순회하며 해당 인덱스(i, j)를 기준으로 각 도형(회전, 대칭 포함)을 사용할 때 최댓값을 구한다.


코드

public class Main {

    private static int n;
    private static int m;
    private static int[][] map;

    public static void main(String[] args) throws IOException {
        init();
        System.out.println(findMax());
    }

    private static void init() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        map = new int[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());
            }
        }
        br.close();
    }

    private static int findMax() {
        int max = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                max = Math.max(findCurMax(i, j), max);
            }
        }
        return max;
    }

    private static int findCurMax(int x, int y) {
        int max = 0;
        int cur;
        // ㅣ 모양
        if (x + 3 < n) {
            cur = map[x][y] + map[x + 1][y] + map[x + 2][y] + map[x + 3][y];
            max = Math.max(cur, max);
        }
        if (y + 3 < m) {
            cur = map[x][y] + map[x][y + 1] + map[x][y + 2] + map[x][y + 3];
            max = Math.max(cur, max);
        }

        // ㅁ 모양
        if (x + 1 < n && y + 1 < m) {
            cur = map[x][y] + map[x][y + 1] + map[x + 1][y + 1] + map[x + 1][y];
            max = Math.max(cur, max);
        }

        // L 모양
        if (x + 2 < n && y + 1 < m) {
            cur = map[x][y] + map[x + 1][y] + map[x + 2][y] + map[x + 2][y + 1];
            max = Math.max(cur, max);

            cur = map[x][y + 1] + map[x][y] + map[x + 1][y] + map[x + 2][y];
            max = Math.max(cur, max);

            cur = map[x][y + 1] + map[x + 1][y + 1] + map[x + 2][y + 1] + map[x + 2][y];
            max = Math.max(cur, max);

            cur = map[x][y] + map[x][y + 1] + map[x + 1][y + 1] + map[x + 2][y + 1];
            max = Math.max(cur, max);
        }
        if (x + 1 < n && y + 2 < m) {
            cur = map[x][y] + map[x + 1][y] + map[x + 1][y + 1] + map[x + 1][y + 2];
            max = Math.max(cur, max);

            cur = map[x + 1][y] + map[x + 1][y + 1] + map[x + 1][y + 2] + map[x][y + 2];
            max = Math.max(cur, max);

            cur = map[x + 1][y] + map[x][y] + map[x][y + 1] + map[x][y + 2];
            max = Math.max(cur, max);

            cur = map[x][y] + map[x][y + 1] + map[x][y + 2] + map[x + 1][y + 2];
            max = Math.max(cur, max);
        }

        // Z 모양
        if (x + 2 < n && y + 1 < m) {
            cur = map[x][y] + map[x + 1][y] + map[x + 1][y + 1] + map[x + 2][y + 1];
            max = Math.max(cur, max);

            cur = map[x][y + 1] + map[x + 1][y + 1] + map[x + 1][y] + map[x + 2][y];
            max = Math.max(cur, max);
        }
        if (x + 1 < n && y + 2 < m) {
            cur = map[x][y] + map[x][y + 1] + map[x + 1][y + 1] + map[x + 1][y + 2];
            max = Math.max(cur, max);

            cur = map[x + 1][y] + map[x + 1][y + 1] + map[x][y + 1] + map[x][y + 2];
            max = Math.max(cur, max);
        }

        // T 모양
        if (x + 2 < n && y + 1 < m) {
            cur = map[x][y] + map[x + 1][y] + map[x + 2][y] + map[x + 1][y + 1];
            max = Math.max(cur, max);

            cur = map[x + 1][y] + map[x][y + 1] + map[x + 1][y + 1] + map[x + 2][y + 1];
            max = Math.max(cur, max);
        }
        if (x + 1 < n && y + 2 < m) {
            cur = map[x][y] + map[x][y + 1] + map[x][y + 2] + map[x + 1][y + 1];
            max = Math.max(cur, max);

            cur = map[x][y + 1] + map[x + 1][y] + map[x + 1][y + 1] + map[x + 1][y + 2];
            max = Math.max(cur, max);
        }

        return max;
    }
}


profile
내일은 개발왕 😎

0개의 댓글