[レベル2]最大正方形を検索

12039 ワード

に答える

board_1 = [[0, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [0, 0, 1, 0]]
board_2 = [[0, 0, 1, 1], [1, 1, 1, 1]]


def solution(board):
    for i in range(1, len(board)):  # num of rows
        for j in range(1, len(board[0])):  # num of columns
            if board[i][j] >= 1:  # 0이 아닌 값들만 업데이트
                # 위, 왼, 좌상단에 인접한 숫자의 최소값 + 1
                board[i][j] = (
                    min(board[i - 1][j], board[i][j - 1], board[i - 1][j - 1]) + 1
                )

    # print(board)
    return max([num for row in board for num in row]) ** 2


print(solution(board_1))
print(solution(board_2))
board配列の(1,1)から、1より大きい値を探します.
1より大きい値が見つかった場合、その位置に左、外、左上隅に隣接する数値の最小値が見つかり、その値に1が加算されます.
  • 累計戦
  • [0, 1, 1, 1], 
    [1, 1, 1, 1], 
    [1, 1, 1, 1], 
    [0, 0, 1, 0]
    累計
  • [0, 1, 1, 1], 
    [1, 1, 2, 2], 
    [1, 2, 2, 3], 
    [0, 0, 1, 0]
    接続された長方形でなければならないので、隣接する値の最小値を+1します.
    最後に、長方形の幅を返す必要があるため、累積した2 Dリストを1 Dに展開し、最大値を検索して平方値を返します.

    2 Dリストを1 Dリストとして作成するには

    my_list = [[1, 2], [3, 4], [5, 6]]
    
    # 방법 1 - sum 함수
    answer = sum(my_list, [])
    
    # 방법 2 - itertools.chain
    import itertools
    list(itertools.chain.from_iterable(my_list))
    
    # 방법 3 - itertools와 unpacking
    import itertools
    list(itertools.chain(*my_list))
    
    # 방법 4 - list comprehension 이용
    [element for array in my_list for element in array]
    
    # 방법 5 - reduce 함수 이용 1
    from functools import reduce
    list(reduce(lambda x, y: x+y, my_list))
    
    # 방법 6 - reduce 함수 이용 2
    from functools import reduce
    import operator
    list(reduce(operator.add, my_list))
    
    # 방법 7 - numpy 라이브러리의 flatten 이용
    # 이 경우에는 원소의 길이가 동일해야 한다
    import numpy as np
    np.array(my_list).flatten().tolist()
    

    参考資料

  • [プログラマー]最大の正方形(レベル2)Pythonプールを検索
  • [python]プログラマーlevel 2最大の正方形を検索(ダイナミックプログラミング,dp)
  • 2 Dリストを1 Dリストとして作成する-from iterable