가장 큰 정사각형 찾기 문제는 동적 프로그래밍으로 풀지 않으면 효율성 테스트에서 통과되지 않는다! 처음에 동적 프로그래밍으로 풀어야 한다는 생각을 하기까지 시간이 좀 걸려서 그 과정까지 함께 설명해보려고 한다.
💥 어떤 문제에 어떻게 동적 프로그래밍을 이용해야 할지 막막하다면 관련 포스팅을 꼭 참고하기!
그 이유는 아래와 같이 크게 두 가지 이다.
1. 점점 값을 쌓아가면서 풀어야함
2. dp를 이용하지 않는다면 3중 반복문을 써야함
[i][j]
라면 dp[i-1][j-1]
, dp[i-1][j]
, dp[i][j-1]
이렇게 세 값을 비교했을 때 가장 작은 값에 1을 더한 값이다! (단, 현재 위치의 board값이 1일 때!)def solution(board):
n = len(board)
m = len(board[0])
# dp 준비
dp = [[0]*m for _ in range(n)]
dp[0] = board[0]
for i in range(1,n):
dp[i][0] = board[i][0]
# 2중 포문으로 연산
for i in range(1, n):
for j in range(1, m):
if board[i][j] == 1:
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1
# 최대 넓이 구하기
answer = 0
for i in range(n):
temp = max(dp[i])
answer = max(answer, temp)
return answer**2
# 위 코드 처럼 dp 배열을 따로 만들지 않고 board의 값을 직접 변경해가면서 값을 구해도 된다!
def solution(board):
n = len(board)
m = len(board[0])
# 2중 포문으로 연산
for i in range(1, n):
for j in range(1, m):
if board[i][j] == 1:
board[i][j] = min(board[i-1][j-1], board[i-1][j], dp[i][j-1]) + 1
# 최대 넓이 구하기
answer = 0
for i in range(n):
temp = max(board[i])
answer = max(answer, temp)
return answer**2
이해가 안돼서 이곳저곳 검색하고 있었는데 여기서 확실히 이해됐네요 감사합니다!!