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

Python에서 정사각형 부분행렬을 전치하여 행렬을 다른 행렬로 변환할 수 있는지 확인

<시간/>

mat1과 mat2라는 두 개의 N X M이 있다고 가정합니다. 연산에서 mat1의 모든 정사각형 부분행렬을 전치할 수 있습니다. 주어진 연산을 수행하여 mat1에서 mat2를 얻을 수 있는지 여부를 확인해야 합니다.

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

5 6 7
1 2 3
6 8 9


5 6 2
1 7 3
6 8 9

mat1의 2x2 크기의 오른쪽 위 부분행렬을 전치하면 mat2가 되기 때문에 출력은 True가 됩니다.

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

  • row :=행렬의 행 수
  • column :=행렬의 열 개수
  • 0~1행 범위의 i에 대해
    • temp1 :=새 목록, temp2 :=새 목록
    • r :=나, 열 :=0
    • r>=0이고 col <열인 동안 do
      • 매트1[r, col]을 temp1에 삽입
      • 매트2[r, col]를 temp2에 삽입
      • r :=r - 1, 열 :=열 + 1
    • temp1 및 temp2 목록 정렬
    • 0에서 temp1 - 1의 크기 범위에 있는 i에 대해
      • temp1[i]가 temp2[i]와 같지 않으면
        • 거짓을 반환
  • 1~1열 범위의 j에 대해
    • temp1 :=새 목록, temp2 :=새 목록
    • r :=행 - 1, 열 :=j
    • r>=0이고 col <열인 동안 do
      • 매트1[r, col]을 temp1에 삽입
      • 매트2[r, col]를 temp2에 삽입
      • r :=r - 1, 열 :=열 + 1
    • temp1 및 temp2 목록 정렬
    • 0에서 temp1 - 1의 크기 범위에 있는 i에 대해
      • temp1[i]가 temp2[i]와 같지 않으면
        • 거짓을 반환
  • 참 반환

예시

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

def solve(mat1, mat2):
   row = len(mat1)
   column = len(mat1[0])
   for i in range(row):
      temp1 = []
      temp2 = []
      r = i
      col = 0
      while r >= 0 and col < column:
         temp1.append(mat1[r][col])
         temp2.append(mat2[r][col])
         r -= 1
         col += 1
      temp1.sort()
      temp2.sort()
      for i in range(len(temp1)):
         if temp1[i] != temp2[i]:
            return False
   for j in range(1, column):
      temp1 = []
      temp2 = []
      r = row - 1
      col = j
      while r >= 0 and col < column:
         temp1.append(mat1[r][col])
         temp2.append(mat2[r][col])
         r -= 1
         col += 1
      temp1.sort()
      temp2.sort()
      for i in range(len(temp1)):
         if temp1[i] != temp2[i]:
            return False
   return True
mat1 = [
      [5, 6, 7],
      [1, 2, 3],
      [6, 8, 9]]
mat2 = [
      [5, 6, 2],
      [1, 7, 3],
      [6, 8, 9]]
print(solve(mat1, mat2))

입력

[
   [5, 6, 7],
   [1, 2, 3],
   [6, 8, 9]],
[
   [5, 6, 2],
   [1, 7, 3],
   [6, 8, 9]]

출력

True