[알고리즘 프로그래머스] 가장 큰 정사각형 찾기 (LEVEL 2)

(문제) 가장 큰 정사각형 찾기 (LEVEL 2) [DP]


1와 0로 채워진 표(board)가 있습니다.

표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다.

표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요.
(단, 정사각형이란 축에 평행한 정사각형을 말합니다.)

예를 들어



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



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

입력설명

입력으로는 2차원 리스트가 들어옵니다.

표(board)는 2차원 배열로 주어집니다.

표(board)의 행(row)의 크기 : 1,000 이하의 자연수

표(board)의 열(column)의 크기 : 1,000 이하의 자연수

표(board)의 값은 1또는 0으로만 이루어져 있습니다.

출력설명

가장 큰 정사각형을 찾아 넓이를 return

테스트케이스

입력예제 출력예제
[[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합니다.

해결방법

우리는 어떻게 DP로 정사각형의 크기를 정할 수 있냐에 관한 생각을 할 수 있다.

DP는 대체로 누적한다는 생각을 가지면 된다.

자, 우선 정사각형은 모서리의 크기가 같으면 생기는 것이다.

그러면 이렇게 생각할 수 있다.



상, 좌, 대각 상/좌 가 전부 1 이면 정사각형이라는 것을 알 수가 있다.

하지만 이러면 1이 4개인 정사각형 밖에 모른다… 이럴 경우 우리는 기존의 값을 누적해서 가져가 생각할 수 있다.

현재 위치의 사각형의 상, 좌, 대각 상/좌 가 전부 1이면 현재 위치의 사각형은 2가 될 수 있다.



이유는 상, 좌, 대각 상/좌 가 전부 1이기 때문이다.

그러면 그 옆에 사각형은 어떻게 되겠나?



이 또한 2가 될 것이다.

만약 모든 상, 좌, 대각 상/좌 의 가장 최소 값에서 + 1을 하는 값이 현재 위치의 사각형 값이 될 것이다.

만약 주변이 전부 2 이면 …



이렇게 3이 될 것이다.

그리고 만약 현재 위치에 있는 사각형의 값이 0이면 이 과정을 이용하지 않는다.



이유는 해당 위치는 값이 없기 때문이다.

그래서 이 문제의 시작은 인덱스 1 열과 1 행부터 시작을 한다.

이유는 상, 좌, 대각 상/좌를 비교해야하기 때문이다.



현재 위치에 있는 값이 1 이면 초기화 되어있는 것이기 때문에 상, 좌, 대각 상/좌 값 중 가장 작은 값 + 1이 현재 위치 값으로 덮어쓴다.

완료 후, 리스트 안에 있는 가장 큰 수에 제곱을 하면 넓이를 구할 수 있다.

이 때 큰 수를 알기 위해 각 행 마다 최대 값을 저장할 수 있는 변수를 0으로 초기화 하여 큰 값이 있으면 대입하면서 저장 후, 그 값을 제곱하여 출력한다.


코드

def solution(board):
    res = 0

    for i in range(1, len(board)):
        for j in range(1, len(board[0])):
            current = min(board[i-1][j], board[i][j-1], board[i-1][j-1])
            if board[i][j] == 1:
                board[i][j] = current + 1
    
    for x in board:
        _max = max(x)
        if res < _max:
            res = _max
            
    return res ** 2

댓글남기기