삽집하는 개발들/알고리즘

[72일차][Lv2][프로그래머스][12949]행렬의 곱셈

악투 2023. 11. 6. 20:29
반응형

문제 설명

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.


제한 사항

행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
곱할 수 있는 배열만 주어집니다.

 

입출력

arr1 arr2 return
[[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

 

코드 및 설명

def solution(arr1, arr2):
    answer = []

    for idx1 in range(len(arr1)):     
        check_arr = []
        for idx2 in range(len(arr2[0])):        
            sum_tmp = 0
            for idx3 in range(len(arr1[0])):    
                sum_tmp += arr1[idx1][idx3] * arr2[idx3][idx2]   
            
            check_arr.append(sum_tmp)
            
        answer.append(check_arr)
                
    return answer

 

import numpy as np

def solution(arr1, arr2):   
    np_arr1 = np.array(arr1)
    np_arr2 = np.array(arr2)    
    result = np.dot(np_arr1, np_arr2)   
    answer = []

    for data in result:
        check_arr = []
        for idx in range(len(data)):
            check_arr.append(int(data[idx]))

        answer.append(check_arr)        

    return answer

 

이 문제는 다차원 배열의 곱을 어떻게 해야하는 지 공식? 계산법? 을 알아야 풀 수 있다.

 

위 이미지를 보면  A 열의 값과 B의 행의 값을 차례로 곱하고 더한 값이 배열의 곱의 값이 된다.

C[i][j] = A[i][1] * B[1][j] 

 

이런식으로 구해야한다. 첫번째 위 코드는 3중 for문을 돌려서 구하는 방식이고, 두번째 코드는 numpy를 이용하여 푸는 방식이다. 첫 번째는 arr1 : [[1, 4], [3, 2], [4, 1]],  arr2 : [[3, 3], [3, 3]]  -> arr1[0][0]의 값이 1과 arr2[0][0]을 곱하면 3, arr1[0][1]과 arr2[1][0]을 곱하면 12이다. 이걸 더 한 값이 15, 그 다음 arr1[0][0]과 arr2[0][1]을 곱하면 3이고, arr1[0][1]과 arr2[1][1]을 곱하면 12이다. 이걸 더 한 값이 15, 결과적으로 answer[0]는 [15,15]가 된다. 이걸 반복하면 된다. 

 

두번째는 numpy를 이용하기 때문에 numpy타입으로 배열을 정의해주고, dot이라는 numpy 내장 함수를 이용하여, 배열의 곱 값을 만들어 낸다. result 값을 그대로 넘기면, 형이 안 맞다는 에러가 나오게 되는 데 타입을 보면 ndarray여서 그렇다. 그래서 for문을 이용하여 재 배열해주고 값을 넘겨준다. 

 

알고리즘을 풀기 위해서 배경지식들이 필요한 것 같다... 아직 부족하지만 계속 문제를 접하다보면 경험이 쌓일 것 같다!!!

 

반응형