algorithm

백준 14500 - 테트로미노

CodeMania 2021. 10. 28. 22:17
import java.io.*;
import java.util.*;

public class Main {
    static int data[][], row, column;
    static int xMove[] = {0, 0, 1, -1}, yMove[] = {1, -1, 0, 0}, max = 0;
    static boolean checked[][];

    // 백준 14500 - 테트로미노
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer rowColumn = new StringTokenizer(bufferedReader.readLine());
        row = strToInt(rowColumn.nextToken());
        column = strToInt(rowColumn.nextToken());
        data = new int[row][column];
        checked = new boolean[row][column];

        for (int i = 0; i < row; i++) {
            StringTokenizer dataStr = new StringTokenizer(bufferedReader.readLine());
            for (int j = 0; j < column; j++) data[i][j] = strToInt(dataStr.nextToken());
        }

        for (int i = 0; i < row; i++)
            for (int j = 0; j < column; j++) {
                dfs(i, j, 0, 1);
            }
        System.out.println(max);
    }

    private static void dfs(int y, int x, int sum, int len) {
        sum += data[y][x];
        // dfs 탐색 중 길이가 4이면 그만둔다
        if(len >= 4) {
            max = Math.max(max, sum);
            return;
        } else if(len == 3) {
            // ㅏ ㅓ ㅗ ㅜ 테트로미노는 길이가 3인 dfs이므로 따로 설정
            // ㅏ ㅓ 테트로미노
            if(y - 2 >= 0 && checked[y - 1][x] && checked[y - 2][x]) {
                if(x < column - 1) max = Math.max(max, sum + data[y - 1][x + 1]);
                if(x >= 1) max = Math.max(max, sum + data[y - 1][x - 1]);
            }
            // ㅗ ㅜ 테트로미노
            if(x - 2 >= 0 && checked[y][x - 1] && checked[y][x - 2]) {
                if(y < row - 1) max = Math.max(max, sum + data[y + 1][x - 1]);
                if(y >= 1) max = Math.max(max, sum + data[y - 1][x - 1]);
            }
        }
        for(int i = 0; i < 4; i++) {
            checked[y][x] = true;
            int nextX = x + xMove[i], nextY = y + yMove[i];
            if(nextX >= 0 && nextX < column && nextY >= 0 && nextY < row) {
                if (!checked[nextY][nextX]) dfs(nextY, nextX, sum, len + 1);
            }
            // 지나간 좌표(노드)여도 재접근될 수 있으므로 false로 초기화
            checked[y][x] = false;
        }
    }


    private static int strToInt(String str) {
        return Integer.parseInt(str);
    }
}

문제링크: 14500 - 테트로미노