코딩테스트/프로그래머스

[프로그래머스] [Level 2] 행렬의 곱셈

박소민 2022. 4. 17. 22:52
문제) 행렬의 곱셈
 

코딩테스트 연습 - 행렬의 곱셈

[[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]]

programmers.co.kr

 

  • 내 풀이
    • 테스트 코드는 pass 
    • 정확성 테스트:  fail & 런타임에러
def solution(arr1, arr2):
    answer = []
    for i in range(len(arr1)):
        ans=[]
        for j in range(len(arr1[0])):
            sum=0
            for k in range(len(arr2)):
                sum+=arr1[i][k]*arr2[k][j]
            ans.append(sum)
        answer.append(ans)
    return answer

 

  • 내 풀이
    • 힌트: 결과의 열 길이는 arr1의 행 길이, arr2의 열 길이와 같다!
    • 두 번째 for문이 결과의 열 길이를 뜻하므로 arr1[0] → arr2[0] 으로 변경
def solution(arr1, arr2):
    answer = []
    for i in range(len(arr1)):
        ans=[]
        for j in range(len(arr2[0])):
            sum=0
            for k in range(len(arr2)):
                sum+=arr1[i][k]*arr2[k][j]
            ans.append(sum)
        answer.append(ans)
    return answer
print(solution([[1, 4], [3, 2], [4, 1]], [[3, 3], [3, 3]]))
print(solution([[2, 3, 2], [4, 2, 4], [3, 1, 4]], [[5, 4, 3], [2, 4, 1], [3, 1, 1]]))
print(solution([[2, 3, 2], [4, 2, 4], [3, 1, 4]], [[5, 4], [2, 4], [3, 1]]))
#결과
[[15, 15], [15, 15], [15, 15]]
[[22, 22, 11], [36, 28, 18], [29, 20, 14]]
[[22, 22], [36, 28], [29, 20]]

 

  • 다른 사람 풀이
    • zip(* ) : 행과 열을 바꿔주는 역할
    • 첫 번째 행렬의 행 값과 두 번째 행렬의 열 값끼리 곱해서 더하는 방식
def solution(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]