본문 바로가기

난 이 분야 전문가야!/Algorithm

[백준][Python] 1915 가장 큰 정사각형 - 풀이 공유

https://www.acmicpc.net/problem/1915

 

1915번: 가장 큰 정사각형

첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다.

www.acmicpc.net

이번 문제는 다이나믹 프로그래밍 알고리즘(DP)을 이용하는 문제로 DP 문제 중에서는 쉬운 난이도에 속하는 것 같습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
n, m = map(int, input().split())
 
data = []
 
for i in range(n):
    s = input()
    data.append(list(map(int, list(s))))
 
dp = [[0 for _ in range(m + 1)] for _ in range(n + 1)]
side = 0
 
for i in range(1, n + 1):
    for j in range(1, m + 1):
        if data[i - 1][j - 1== 1:
            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1
 
            if dp[i][j] > side:
                side = dp[i][j]
 
print(side**2)
cs

 

data : input으로 들어오는 숫자 배열을 받은 2차원 리스트

dp : data 리스트를 탐색하면서 채울 DP 테이블

side : 최대 변의 길이

 

data[i - 1][j - 1]가 0일 경우 정사각형을 만들 수 없으므로 1일 경우에만 체크합니다.

dp[i][j]에는 data[i - 1][j - 1]를 정사각형의 우측하단 꼭짓점으로하여 만들수 있는 정사각형의 변의 길이를 저장합니다.

side에 새로 만들어진 변의 길이가 최대 길이인지 확인하고 수정합니다.

 

 

 

728x90