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]와 같지 않으면
- 거짓을 반환
- 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]와 같지 않으면
- 거짓을 반환
- 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