ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Programmers] 가장 큰 정사각형 찾기 (lv2, Java, DP)
    Algorithm 2022. 6. 14. 07:29
    728x90
    반응형

     

    - 목차

     

    문제 설명.

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

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

    1와 0로 채워진 표(board)가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요. (단, 정사각형이란 축에 평행한 정사각형을 말합니다.)

    예를 들어

    0 1 1 1
    1 1 1 1
    1 1 1 1
    0 0 1 0

     

    가 있다면 가장 큰 정사각형은

    0 1 1 1
    1 1 1 1
    1 1 1 1
    0 0 1 0

     

    가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다.

     

    제한사항

    • 표(board)는 2차원 배열로 주어집니다.
    • 표(board)의 행(row)의 크기 : 1,000 이하의 자연수
    • 표(board)의 열(column)의 크기 : 1,000 이하의 자연수
    • 표(board)의 값은 1또는 0으로만 이루어져 있습니다.

    입출력 예

    [[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9
    [[0,0,1,1],[1,1,1,1]] 4

     

    입출력 예 설명

    입출력 예 #1
    위의 예시와 같습니다.

    입출력 예 #2
    | 0 | 0 | 1 | 1 |
    | 1 | 1 | 1 | 1 | 
    로 가장 큰 정사각형의 넓이는 4가 되므로 4를 return합니다.

     

    문제 분석.

    0과 1로 채워진 2차원 행렬이 제공됩니다.

    이 문제는 제시된 행렬에서 1로 이루어진 가장 큰 정사각형을 찾는 문제인데요.

    모든 Cell 을 순회하면서 정답을 찾아가기보다는 DP 의 관점에서 접근해야합니다.

    인접하는 3개의 Cell 의 값을 확인하여 새로운 Cell 의 값을 업데이트합니다.

     

    아래 이미지처럼 왼쪽, 위, 왼&위 방향 Cell 의 값이 모두 1 이상이여야 마지막 Cell 의 값이 증가됩니다.

     

     

    문제 풀이.

    class Solution {
      public int solution(int[][] board) {
        int answer = 0;
        if (board.length == 0) return 0;
        if (board.length == 1) {
          for (int i = 0; i < board[0].length; i++) {
            answer = Math.max(board[0][i], answer);
          }
          return answer;
        }
        
        
        for (int y = 1; y < board.length; y++) {
          for (int x = 1; x < board[0].length; x++) {
            int prevCell = board[y - 1][x - 1];
            int upperCell = board[y - 1][x];
            int leftCell = board[y][x - 1];
            int curCell = board[y][x];
            if (prevCell > 0 && upperCell > 0 && leftCell > 0 && curCell > 0) {
              board[y][x] = Math.min(Math.min(prevCell, upperCell), leftCell) + 1;
              answer = Math.max(board[y][x], answer);
            } else {
              board[y][x] = curCell;
              answer = Math.max(board[y][x], answer);
            }
          }
        }
    
        return answer * answer;
      }
    }

     

    반응형
Designed by Tistory.