Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 허용되는 열 교환으로 1의 가장 큰 사각형 찾기


이진 행렬이 있다고 가정하면 해당 행렬에서 모든 1 중 가장 큰 직사각형을 찾아야 합니다. 사각형은 해당 행렬의 열 쌍을 바꾸거나 교환하여 만들 수 있습니다.

따라서 입력이 다음과 같으면

1 0 0 1 0
1 0 0 1 1
1 1 0 1 0

이 경우 출력은 6이 됩니다. 사각형은 열 1을 3으로 교환하여 생성할 수 있습니다. 교환 후 행렬은 -

0 0 1 1 0
0 0 1 1 1
1 0 1 1 0

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • row :=매트의 크기

  • col :=매트의 크기[0]

  • temp :=순서(행 + 1) x (열 + 1)의 행렬, 0으로 채움

  • 범위 0에서 col까지의 i에 대해 수행

    • temp[0, i] :=매트[0, i]

    • 행까지 범위 1의 j에 대해 수행

      • mat[j, i]가 0과 같으면

        • temp[j, i] :=0

      • 그렇지 않으면

        • temp[j, i] :=temp[j - 1, i] + 1

  • 범위 0에서 행까지의 i에 대해 수행

    • cnt :=크기의 배열(행 + 1), 0으로 채워짐

    • 범위 0에서 열까지의 j에 대해 1씩 증가, 수행

      • cnt[temp[i,j]] :=cnt[temp[i,j]] + 1

    • col_no :=0

    • j :=행

    • j>=0인 동안 수행

      • cnt[j]> 0이면

        • 범위 0에서 cnt[j]에 있는 k에 대해 수행

          • temp[i, col_no] :=j

          • col_no :=col_no + 1

      • j :=j - 1

  • area_maximum :=0

  • 범위 0에서 행까지의 i에 대해 수행

    • 0에서 col 범위의 j에 대해 수행

      • area_current :=(j + 1) * temp[i, j]

      • area_current> area_maximum이면

        • area_maximum :=area_current

  • 반환 area_maximum

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

def maxArea(mat):
   row = len(mat)
   col = len(mat[0])
   temp = [[0 for i in range(col + 1)] for i in range(row + 1)]
   for i in range(0, col):
      temp[0][i] = mat[0][i]
   for j in range(1, row):
      if ((mat[j][i] == 0)):
         temp[j][i] = 0
      else:
         temp[j][i] = temp[j - 1][i] + 1
   for i in range(0, row):
      cnt = [0 for i in range(row + 1)]
      for j in range(0, col, 1):
         cnt[temp[i][j]] += 1
      col_no = 0
      j = row
      while(j >= 0):
         if (cnt[j] > 0):
            for k in range(0, cnt[j]):
               temp[i][col_no] = j
               col_no += 1
         j -= 1
   area_maximum = 0
   for i in range(0, row):
      for j in range(0, col):
         area_current = (j + 1) * temp[i][j]
         if (area_current > area_maximum):
            area_maximum = area_current

   return area_maximum
mat = [
   [0, 0, 1, 1, 0],
   [0, 0, 1, 1, 1],
   [1, 0, 1, 1, 0]]
print("Area : ",maxArea(mat))

입력

[ [1, 0, 0, 1, 0],
[1, 0, 0, 1, 1],
[1, 1, 0, 1, 0]]

출력

Area : 2