프로그래머스_행렬의 곱셈

임정민·2023년 9월 26일
1

알고리즘 문제풀이

목록 보기
111/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 40분 소요


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

    transposed_arr2 = []

    for col in range(len(arr2[0])):
        new_row = []
        for row in range(len(arr2)):
            new_row.append(arr2[row][col])
        transposed_arr2.append(new_row)

    for v1 in arr1:
        
        tmp = []
        for v2 in transposed_arr2:
            tmp.append(sum([x*y for x,y in zip(v1,v2)]))
        
        answer.append(tmp)

    return answer

행렬 연산 문제입니다. 두가지 행렬이 주어집니다. 이때, 한가지 행렬을 transpose 변환한 뒤 한 행씩 각 요소별 곱의 합을 연산하는 방식입니다. 두 리스트에서 인덱스에 맞는 두 요소를 곱하고 합하기 위해 zip()함수로 묶어 표현하였습니다.

[다른 사람의 풀이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]

'나의 풀이'와 같은 연산방식이되 list comprehension을 통해 간결히 구현한 방식입니다. '나의 풀이'에서는 한 리스트를 transpose하여 저장하였다면 위 풀이는


for B_col in zip(*B)

로 표현하여 transpose 시키고 바로 연산하는 방식이였습니다. zip(*리스트) 와 같은 코드는 처음 보는 형태로 재밌는(?) 포인트였습니다.

[다른 사람의 풀이2]


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중 for문으로 구현한 방식입니다. 행렬곱의 특성상 예를 들어 차원이, 2x2 * 2x1 이라면 결과는 2행x1열입니다. 이때, 2행은 A행렬의 행의 크기이고 1열은 B행렬의 열의 크기이기 때문에 처음 2중 for문 형태에서 위와 같이 표현하게 됩니다.


for i in range(len(A)):
        for j in range(len(B[0])):

그 후 특정 행/열안의 요소 갯수는 A행렬의 열 혹은 B행렬의 행이기 때문에

for k in range(len(A[0])):

와 같이 표현하고 연산하면 되는 방식입니다. 차례차례 이해한다면 구현이 어려운 방식은 아니였습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글