# matrixout 함수가 차수가 size인 정방행렬 mx를 출력
def matrixout(mx, size, is_inverse):
    blanks = size * 7 + 2
    
    print("\u250c", end = "")
    for i in range(0,blanks):
        print(" ", end = "")
    print("\u2510")

    if(is_inverse == True):   # 역행렬 부분만 출력
        for i in range(0, size):
            print("| ", end = "")
            for j in range(0, size):
                print("% 1.3f" % mx[i][j + 3], end = " ")
            print(" |")
    else:                     # 원본 행렬 부분만 출력
        for i in range(0, size):
            print("| ", end = "")
            for j in range(0, size):
                print("% 1.3f" % mx[i][j], end = " ")
            print(" |")

    print("\u2514", end = "")
    for i in range(0,blanks):
        print(" ", end = "")
    print("\u2518")

# 차수가 k인 정방행렬을 정의하고 정숫값으로 초기화
# 최종적으로 a를 단위행렬로 만듦 
a = [[2,0,3,1,0,0],[2,5,3,0,1,0],[1,0,8,0,0,1]]
n = 3 # 행렬의 차수

# 초기화된 행렬 a를 출력
print("행렬 A : \n")
matrixout(a, n, False)

# 역행렬을 반복문으로 계산
for i in range(n):
    if a[i][i] == 0.0:
        sys.exit('Divide by zero detected!')
        
    for j in range(n):
        if i != j:
            ratio = a[j][i]/a[i][i]
            for k in range(2*n):
                a[j][k] = a[j][k] - ratio * a[i][k]

# 주대각 성분을 1로 만들기 위한 행 연산
for i in range(n):
    divisor = a[i][i]
    for j in range(2*n):
        a[i][j] = a[i][j]/divisor

# 결과인 역행렬을 출력
print("\nA의 역행렬 :\n");
matrixout(a, n, True)