본문 바로가기
알고리즘 풀이

[알고리즘] 프로그래머스 | 행렬의 곱셈

by 째깍단 2023. 8. 16.

행렬의 곱셈

답: 

더보기
def solution(arr1, arr2):
    answer = []
    n1 = len(arr1)
    n2 = len(arr2[0])
    for i in range(n1):
        num_list = []
        for k in range(n2):
            number = 0
            for j in range(len(arr1[0])):
                number += arr1[i][j] * arr2[j][k]
            num_list.append(number)
        answer.append(num_list)
    return answer

 

 

 

문제 분석 및 해석

이차원배열 arr1, arr2

arr1 arr2 곱한 결과를 반환하는 함수, solution 반환

 

 

>> 풀이생각

for문을 여러번 사용하여 arr1의 행과 arr2의 열을 곱하고 더하는 식을 만든다

 

 

과정1.

def solution(arr1, arr2):
    """행렬의 곱셈 : arr1의 행 * arr2의 열의 합이 해당 위치의 결과값"""
    n = len(arr1)
    answer = [[0]*n for _ in range(n)]
    for i in range(n): # arr1의 전체 요소 길이만큼 0 1 2
        for j in range(len(arr1[i])): # arr1의 요소(행 길이)
            for k in range(len(arr2)): # arr2의 열 index
            answer[i][j] += arr1[i][k] * arr2[k][j]
    return answer

 

이 과정에서 answer 행렬의 크기에 오류가 생겼다.

오류 : 실행한 결괏값 [[15,15,0],[15,15,0],[15,15,0]]이 기댓값 [[15,15],[15,15],[15,15]]과 다릅니다.

 

answer = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 행렬 잘못만듦

 

 

 

 

과정2.

따라서 arr1[0]길이와 arr2의 길이를 사용해 answer를 만들도록 수정함

 

def solution(arr1, arr2):
    n1 = len(arr1[0])
    n2 = len(arr2)
    answer = [[0]*n2 for _ in range(n1)] #arr2의 열 / arr1의 행
    for i in range(len(arr1)):
        for j in range(n1):
            for k in range(n2):
                answer[i][j] += arr1[i][k] * arr2[k][j]
    return answer

 

0으로 이루어진 행렬은 잘 만들어졌지만 아래의 식에서 list out of range오류 발생..

 

고쳐서 테스트 케이스는 통과했지만 정확성 테스트 모두를 실패 / 런타임 에러

따라서 식을 만드는 과정 자체를 array에 append 및 초기화하는 형식으로 수정하고자 했다.

 

 

 

과정3.

 

for 문을 돌면서 (행 * 열) 계산을 number에 더한다.

 

num_list에 계산한 number를 append, answer에 num_list를 append하고 초기화 하여 다음 행렬을 계산

 

def solution(arr1, arr2):
    answer = []
    n1 = len(arr1)
    n2 = len(arr2[0])
    for i in range(n1):
        num_list = []
        for k in range(n2):
            number = 0
            for j in range(len(arr1[0])):
                number += arr1[i][j] * arr2[j][k]
            num_list.append(number)
        answer.append(num_list)
    return answer

 

 


첫번째 방법. 왜 안될까?