본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv2 행렬의 곱셈 (python)

by 개발하는 호랑이 2024. 2. 18.

행렬의 곱셈

풀이

문제가 무슨 아무 설명도 없어서 뭐 어떻게 풀라고 하다가, 질문하기에 있는 내용을 보고 행렬의 곱셈이라는 수학 공식이 있음을 알고 풀었다.

lv2로 오고 나서는 내 머리가 지끈 거린다. 단순 머리로만은 못 풀고 이젠, 손도 같이 써서 작업을 해야 할 듯하다.

arr1의 길이 즉 행을 a로 반복하고,
arr2 [0]의 길이 즉 arr2의 열을 반복하면서 더할 값을 넣어두고,
arr2의 길이 즉 arr2의 행을 반복하면서 값들을 곱하고 더해주고 빠져나오면 tmp_row에 넣어준다.

글을 작성하면서도 괜히 헷갈린다.

def solution(arr1, arr2):
    answer = []
    for a in range(len(arr1)):
        tmp_row = []  # 각 행에 대한 결과를 저장할 임시 리스트
        for b in range(len(arr2[0])):
            tmp = 0
            for c in range(len(arr2)):
                tmp += arr1[a][c] * arr2[c][b]
            tmp_row.append(tmp)  # 한 행의 계산 결과를 추가
        answer.append(tmp_row)  # 전체 결과 리스트에 행 결과를 추가
    return answer

다른 사람 풀이

방법 1

# 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
# 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
def productMatrix(A, B):
    return [[sum(a*b for a, b in zip(A_row,B_col)) for B_col in zip(*B)] for A_row in A]

# 아래는 테스트로 출력해 보기 위한 코드입니다.
a = [ [ 1, 2 ], [ 2, 3 ]];
b = [[ 3, 4], [5, 6]];
print("결과 : {}".format(productMatrix(a,b)));

방법 2

import numpy as np
def productMatrix(A, B):

    return (np.matrix(A)*np.matrix(B)).tolist()

방법 3

def productMatrix(A, B):
    answer = []

    for i in range(len(A)):
        arr = []
        for j in range(len(B[0])):
            tmp = 0
            for k in range(len(A[0])):
                tmp += A[i][k] * B[k][j]
            arr.append(tmp)
        answer.append(arr)

    return answer

여러 방법이 있는데, 아직은 방법 3이 제일 읽기가 쉽다.