https://leetcode.com/problems/maximal-square/
이진 행렬(binary matrix)에서 1로만 이루어진 가장 큰 정사각형의 넓이를 찾는 문제
입력:
1 1 1
1 1 1
1 1 1
출력: 9 (3x3 정사각형이 가능)
public int maximalSquare(char[][] matrix) {
int answer = 0;
int m = matrix.length;
int n = matrix[0].length;
for (int length = 1; length <= Math.max(m, n); length++) {
for (int x = 0; x < m; x++) {
for (int y = 0; y < n; y++) {
if (checkSquare(matrix, x, y, length)) {
answer = length * length;
}
}
}
}
return answer;
}
최악의 경우 시간 초과 (1 <= m, n <= 300)
dp[i][j]: (i,j)를 우하단 꼭지점으로 하는 최대 정사각형의 한 변의 길이
if matrix[i-1][j-1] == '1':
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
else:
dp[i][j] = 0
int m = matrix.length;
int n = matrix[0].length;
int[][] dp = new int[m + 1][n + 1];
int maxLength = 0; // 최대 정사각형의 한 변 길이
예시 매트릭스:
1 1 1
1 1 1
1 1 1
0 0 0 0
0 * * * (* = 미계산)
0 * * *
0 * * *
0 0 0 0 → 0 0 0 0 → 0 0 0 0
0 1 * * 0 1 1 * 0 1 1 1
0 * * * 0 * * * 0 1 2 2
0 * * * 0 * * * 0 1 2 3
class Solution {
public int maximalSquare(char[][] matrix) {
int answer = 0;
int m = matrix.length;
int n = matrix[0].length;
int[][] dp = new int[m + 1][n + 1];
int maxLength = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (matrix[i - 1][j - 1] == '1') {
dp[i][j] = Math.min(
Math.min(dp[i - 1][j], dp[i][j - 1]),
dp[i - 1][j - 1]
) + 1;
maxLength = Math.max(maxLength, dp[i][j]);
}
}
}
answer = maxLength * maxLength;
return answer;
}
}