[프로그래머스/Lv.2] 행렬의 곱셈 | 파이썬 Python

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12949

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

 

 

제한사항

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

 

입출력 예

 

 

나의 풀이1 (실패)

def solution(arr1, arr2):
    arr = [[0] * len(arr1[0]) for _ in range(len(arr1))]
    
    for i in range(len(arr1)):
        for j in range(len(arr1[0])):
            for k in range(len(arr2)):
                arr[i][j] += arr1[i][k] * arr2[k][j]
            
    return arr
  • 예제는 통과했는데 제출하니까 전부 런타임 에러가 발생한다.

 

나의 풀이2 (성공)

def solution(arr1, arr2):
    arr = [[0] * len(arr2[0]) for _ in range(len(arr1))]
    
    for i in range(len(arr1)):
        for j in range(len(arr2[0])):
            for k in range(len(arr1[0])):
                arr[i][j] += arr1[i][k] * arr2[k][j]
            
    return arr

 

행렬의 곱셈은 쉽게 설명하자면 arr1의 행과 arr2의 열을 곱하는 것이다.

 

for i in range(len(arr1)):
    for j in range(len(arr1[0])):
        for k in range(len(arr2)):
            arr[i][j] += arr1[i][k] * arr2[k][j]

나는 미리 결과 행렬을 만들고, 3중 for문을 실행해서 원소를 수정하는 방식으로 풀었다.

`arr1[i]`의 각 원소와 `arr2[k]`의 각 원소를 곱해서 그 값을 `arr[i][j]`에 누적한다.

 

다른 사람의 풀이

def solution(arr1, arr2):
    answer = []
    
    for i in range(len(arr1)):
        arr = arr1[i]
        res = []
        for j in range(len(arr2[0])):
            temp = 0
            for k in range(len(arr1[0])):
                temp += arr[k] * arr2[k][j]
            res.append(temp)   
        answer.append(res)
            
    return answer
  • 결과 행렬을 빈 배열로 초기화해서 하나의 행을 만들 때마다 `append()`한다.
  • arr1의 행마다 복사본을 만든 후에 하나씩 값을 누적해서 구한다. 인덱스를 자리에 맞게 찾아나가는 과정은 이 풀이가 더 간단했던 거 같다.

 

회고

  • 간단해 보이는 문제인데 for문을 3중으로 실행하느라 각 인덱스의 올바른 위치를 찾는데 꽤나 고생했던 문제...