본문 바로가기
PS

[Programmers-Java] 가장 큰 정사각형 찾기

by given-dev 2024. 1. 24.

https://school.programmers.co.kr/learn/courses/30/lessons/12905

접근

  1. 행 + 1, 열 + 1 크기의 배열을 생성한다.
  2. 표에서 1이면 좌, 상, 좌상의 정사각형을 확인하고 그 중 최솟값 + 1을 계산한다.
  3. 정사각형의 한 변의 길이를 메모이제이션한다.

풀이

class Solution {
    public int solution(int[][] board) {
        int row = board.length + 1;
        int col = board[0].length + 1;

        int maxSide = 0;
        int[][] dp = new int[row][col];
        for (int r = 1; r < row; r++) {
            for (int c = 1; c < col; c++) {
                if (board[r - 1][c - 1] == 1) {
                    dp[r][c] = Math.min(dp[r][c - 1], Math.min(dp[r - 1][c], dp[r - 1][c - 1])) + 1; // (1)
                    maxSide = Math.max(maxSide, dp[r][c]); // (2)
                }
            }
        }

        return maxSide * maxSide;
    }
}
  • (1) 좌, 상, 좌상의 dp 값 중 최솟값에 1을 더한다.
  • (2) 정사각형의 한 변의 길이의 최댓값을 갱신한다.

예시


위와 같은 board가 있다.


board 값이 1이면 좌, 상, 좌상의 dp 값 중 최솟값 + 1을 저장한다.


순회가 끝나면 dp는 위와 같고, 가장 큰 정사각형의 한 변의 길이는 3이 된다.