[백준] 1915: 가장 큰 정사각형 - JAVA

https://www.acmicpc.net/problem/1915

풀이

1로 채워진 가장 큰 정사각형을 구하는 문제이다.

주어진 0과 1을 이차원배열에 넣고 dp배열을 만들어 채워나간다.

원래 배열의 값이 0이면 dp배열의 값도 0이 되고,

원래 배열의 값이 1이면 dp배열의 [i-1][j], [i][j-1], [i-1, j-1]값을 확인해야 한다.

저 값들 중 가장 작은 값에 1을 더해주면 현재 위치를 끝으로 하는 정사각형의 길이가 된다.

길이의 최댓값을 갱신하며 dp배열을 채우고 넓이를 구해주면 끝.


메모리: 27708KB

시간: 332ms

언어: Java 11

코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(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[][] arr = new int[n + 1][m + 1];
        for (int i = 1; i < n + 1; i++) {
            String line = br.readLine();
            for (int j = 1; j < m + 1; j++) {
                arr[i][j] = line.charAt(j - 1) - '0';
            }
        }

        int[][] dp = new int[n + 1][m + 1];
        int max = 0;
        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < m + 1; j++) {
                if (arr[i][j] == 0) {
                    dp[i][j] = 0;
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
                }
                max = Math.max(max, dp[i][j]);
            }
        }

        System.out.println(max * max);

    }

}