dp
리스트를 생성상
, 좌
, 좌측상단
의 dp
리스트 값 중 최소값을 해당 좌표 dp
리스트에 저장dp
리스트의 좌표 값이 answer
보다 크면 answer
값 갱신answer
에 저장된 값이 가장 긴 정사각형의 한 변 길이이므로 제곱하여 정답 출력📌 dp
없이 풀려고 도전했다가 시간초과만 났던 문제
📌 상
, 좌
, 좌측상단
의 값을 탐색할 때 리스트의 범위를 벗어날 수 있지만 벗어나는 좌표의 dp
리스트 값은 아직 탐색을 하기 전 값이므로 상관이 없음
n×m의 0, 1로 된 배열이 있다. 이 배열에서 1로 된 가장 큰 정사각형의 크기를 구하는 프로그램을 작성하시오.
0 1 0 0
0 1 1 1
1 1 1 0
0 0 1 0
위와 같은 예제에서는 가운데의 2×2 배열이 가장 큰 정사각형이다.
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
arr = [list(map(int, input().strip('\n'))) for _ in range(N)]
dp = [[0] * M for _ in range(N)]
answer = 0
for i in range(N):
for j in range(M):
if arr[i][j]:
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]
print(answer ** 2)