Channi Studies

[LeetCode] 221. Maximal Square 본문

python

[LeetCode] 221. Maximal Square

Chan Lee 2025. 3. 16. 06:29

https://leetcode.com/problems/maximal-square/description/

 

 

이 문제를 풀기 위해서 nested for loop을 사용했습니다.

Input n x m 에 맞춰 각 반복문에서 현재 위치 기준으로 좌단, 상단, 좌상단 index를 모두 확인하여 그 중 최솟값에 + 1을 하는 전략을 취했습니다. 

만약 현재 인덱스가 0이라면 해당 위치에서 구성할 수 있는 최대 사각형의 넓이 또한 0이므로, 즉시 다음 반복문으로 넘어갑니다. 

매 반복문의 마지막에 max_num을 업데이트 해주면서, 최종적으로 길이의 제곱을 반환해 넓이 값을 리턴합니다. 

def maximalSquare(self, matrix: List[List[str]]) -> int:
    n = len(matrix)
    m = len(matrix[0])
    dp = [[0] * m for _ in range(n)]

    max_num = 0
    for i in range(n):
        for j in range(m):
            if matrix[i][j] == "0":
                continue
            left = top = diag = 0
            if i > 0: left = int(dp[i-1][j])
            if j > 0: top = int(dp[i][j-1])
            if (i > 0) and (j > 0): diag = int(dp[i-1][j-1])
            dp[i][j] = min(left, top, diag) + 1

            max_num = max(dp[i][j], max_num)

    return max_num ** 2

 

살짝 efficiency를 다듬은 코드는 다음과 같습니다. 

def maximalSquare(self, matrix: List[List[str]]) -> int:
    n = len(matrix)
    m = len(matrix[0])
    dp = [[0] * m for _ in range(n)]

    max_num = 0
    for i in range(n):
        for j in range(m):
            if matrix[i][j] == "0":
                continue
            if (i < 1) or (j < 1): dp[i][j] = 1
            else: dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
            max_num = max(dp[i][j], max_num)

    return max_num ** 2

 

'python' 카테고리의 다른 글

Iterable, Iterator, Generator  (0) 2025.02.21
Bitwise Operators  (0) 2025.02.21
Files and Exceptions  (0) 2025.02.10
Tuple 튜플  (0) 2025.01.26
List 리스트  (0) 2025.01.26