코딩 기록 저장소

[프로그래머스/Python] 가장 큰 정사각형 찾기 본문

프로그래머스/Lv.2

[프로그래머스/Python] 가장 큰 정사각형 찾기

KimNang 2024. 3. 11. 18:26

문제 정보

제목 : 가장 큰 정사각형 찾기

난이도 : Lv.2

사용 언어 : Python

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

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

예를 들어

1 2 3 4
0 1 1 1
1 1 1 1
1 1 1 1
0 0 1 0

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

1 2 3 4
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으로만 이루어져 있습니다.

 

입출력 예

board answer
[[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합니다.


나의 풀이

board보다 행과 열이 1씩 큰 dp를 선언하여 0으로 초기화합니다. board의 행+1 열+1길이만큼 반복하는 이중 for 루프를 이용해 순차적으로 순회하면서 board[i-1][j-1]이 1인지 확인합니다. 이 조건이 참이라면 해당 구간의 이전 부분을 확인하여 dp의 값을 계산합니다. 이때 현재 dp의 값이 최대값(answer)보다 크다면 answer을 dp의 현재 값으로 변경합니다.

모든 반복이 끝나면 answer을 제곱하여 return합니다.

 

코드

def solution(board):
    answer = 0
    dp = [[0 for _ in range(len(board[0])+1)] for _ in range(len(board)+1)]
    
    for i in range(1, len(board)+1) :
        for j in range(1, len(board[0])+1) :
            if(board[i-1][j-1] == 1):
                dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) +1
                if dp[i][j] > answer :
                    answer = dp[i][j] 
    return answer**2