기록하는삶

[코딩 테스트 연습(파이썬/Python)] 프로그래머스 _ 행렬의 곱셈 본문

프로그래머스/프로그래머스_lv2(Python)

[코딩 테스트 연습(파이썬/Python)] 프로그래머스 _ 행렬의 곱셈

mingchin 2021. 9. 26. 20:11
728x90
반응형

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

 

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

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

[문제 설명]

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

[제한 조건]

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

직접 transpose도 구하고, 정답 행렬을 만들어 놓은 채로 연산을 진행해 조금은 비효율적이 됐다.

def solution(arr1, arr2):
    n = len(arr1) ; m = len(arr2[0])
    answer = []
    for i in range(n):
        answer.append(list(map( int , list('0'*m))))
    arr2_t = []
    for i in range(m):
        arr2_t.append([arr2[j][i] for j in range(len(arr2))])
    for j in range(m):
        for i in range(n):
            answer[i][j] += sum([x*y for x,y in zip(arr1[i], arr2_t[j])])
    return answer

내장함수 zip을 더 잘 활용하는 코드도 보았다. 예를들어,

# 일종의 transpose를 구하는 방법이다.
list(zip(*[[1,2], [3,4], [5,6]]))

이렇게 zip안에 이중 리스트를 넣되 앞에 *를 붙여주면 가능한 범위까지 열로 이루어진 tuple을 반환해주므로, 해당 문제에서 주어지는 배열을 넣으면 transpose를 구할 수 있게 됨을 이용하는 것이다.

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]

for문 구성시 뒷쪽에 곱해지는 행렬이 먼저 선언되어 고정되어야 함은 동일하다.

728x90
반응형