Algorithm/코딩테스트 (Java)

[LeetCode] 221. Maximal Square

싱브이 2024. 6. 2. 20:49
728x90
반응형

문제

 

Given an m x n binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.

 

Example 1:

Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
Output: 4

 

Example 2:

 

Input: matrix = [["0","1"],["1","0"]]
Output: 1

 

 

 

 

내 생각

 

1로 구성된 정사각형의 넓이를 구하는 문제이다. dp를 사용해서 풀면된다!

현재 위치의 값이 '1'인 경우에 가능한 가장 큰 정사각형의 변의 길이를 계산한다. 

dp[i][j] 가 (i-1, j-1) 위치에서 끝나는 가장 큰 정사각형의 한 변의 길이이다.

dp[i][j]의 값은 matrix[i-1][j-1]이 '1'일 때, dp[i-1][j], dp[i][j-1], dp[i-1][j-1] 값 중 최소값에 1을 더한 값이다.

 

 

 

내 코드

class Solution {
    public int maximalSquare(char[][] matrix) {
        int n = matrix.length;
        if (n == 0) return 0;
        int m = matrix[0].length;

        int[] dp = new int[m + 1];
        int max = 0, prev = 0;

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                int temp = dp[j]; //현재 dp[j] 값을 temp에 저장
                // 현재 위치의 값이 '1'인 경우
                if (matrix[i - 1][j - 1] == '1') {
                    // dp[j] 값을 갱신, 이전 값들 중 최소값에 1을 더함(현재 위치에서 가능한 가장 큰 정사각형의 변의 길이 계산)
                    dp[j] = Math.min(dp[j], Math.min(dp[j - 1], prev)) + 1;
                    // 최대 변의 길이 갱신
                    max = Math.max(dp[j], max);
                } else {
                    // 행렬의 현재 값이 '0'인 경우, dp[j]를 0으로 설정
                    dp[j] = 0;
                }
                // prev를 갱신하여 다음 열의 dp[j-1]로 사용
                prev = temp;
            }
        }
        // 가장 큰 정사각형의 면적 반환
        return max * max;
    }
}
728x90
반응형