유한 집합 {0,1,....n-1} 위의 이항연산은 (nxn)-2차원 배열로 표시할 수 있습니다.
예컨대 i와 j의 연산값을 i * j = a[i][j] 로 주면 됩니다.
문제 1: (매우 쉬움) 특정한 2차원 (nxn)-배열로 주어진 연산이 교환법칙을 만족하는지 판별하는 함수를 작성하세요.
문제 2: (조금 어려움) 연산이 닫혀 있을 때 앞서 주어진 배열에 대하여 삼항 연산이 다음의 두가지 방법으로 정의될 수 있습니다. m_1(i,j,k) := (i*j)*k, m_2(i,j,k) := i*(j*k) 위의 두 삼항연산이 같은 경우 결합법칙이 성립한다고 합니다. 앞서 주어진 배열의 원소가 {0,1,...,n-1} 으로 주어질 때, 배열로 주어진 이항연산이 결합법칙을 만족하는지 판별하는 함수를 작성하세요.
python 3.8
# 문제 1의 해
A = [[1,2,3], [4,5,6]]
B = [[5,6], [7,8], [9,0]]
def matrix_product(M1, M2):
rows = len(M1)
cols = len(M2[0])
mids = len(M1[0])
R = [[0 for _ in range(cols)] for _ in range(rows)]
if cols == rows:
for i in range(cols):
for j in range(rows):
for m in range(mids):
R[i][j] += M1[i][m]*M2[m][j]
for i in range(len(R)):
for j in range(len(R[0])):
print(f"{R[i][j]:>3}", end=" ")
print()
return R
else:
return "can not product"
def are_matrices_equal(M1, M2):
if len(M1) != len(M2) or len(M1[0]) != len(M2[0]):
return False
for i in range(len(M1)):
for j in range(len(M1[0])):
if M1[i][j] != M2[i][j]:
return False
return True
if matrix_product(A, B) == "곱셈불가" or \
not are_matrices_equal(matrix_product(A, B), matrix_product(B, A)):
print("교환법칙 불만족")
else:
print("교환법칙 만족")
# 문제 2의 해
A = [[1,2], [3,4]]
B = [[5,6], [7,8]]
C = [[9,0], [1,2]]
# (A*B)*C = A*(B*C) ??
T1 = matrix_product(A, B)
Q1 = matrix_product(T1, C)
T2 = matrix_product(B, C)
Q2 = matrix_product(A, T2)
if are_matrices_equal(Q1, Q2):
print("결합법칙 성립")
else:
print("결합법칙 불성립")
풀이 작성
코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.