문제 설명

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

제한사항

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

Idea

현재 DACON, kaggle문제를 풀고 있는 사람으로써 이문제를 cheatting으로 바로 풀어버렸다..

import numpy as np
def solution(arr1, arr2):
    return np.dot(arr1, arr2).tolist()

물론 이렇게 푸는게 공부는 당연히 안된다. 그래서 product을 구현해보았다.
문제에서 요구하는것은 2차원, 그러니까 matrix product를 구현하라는것.
image address : here

Code

def solution(arr1, arr2):
    return [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*arr2)] for X_row in arr1]

Explain

위의 코드는 압축형 코드이고, 풀어쓰면 다시 아래와 같이 쓸수있다.

def solution(arr1, arr2):
    answer = list()

    for X_row in arr1:
        row_result = list()
        for Y_col in zip(*arr2): 
            # zip(*arr2)는 [i[0] for i in arr2]와 같은 코드다.
            temp = 0
            for a,b in zip(X_row, Y_col):
                temp += a*b
            row_result.append(temp)
        answer.append(row_result)

    return answer
    

위의 코드에서는 인덱스 접근을 하지않고, 원소 하나씩 했지만, 인덱스 접근을 하면 answer코드만

answer = [[0 for j in range(len(arr2[0])) ] for i in range(len(arr1))]

이런식으로 바꾸고 loop도 적절하게 수정하면 되겠다.

여기서 제일 중요한거는 실행시간인데, np.dot()이 40배정도 빨랐다 ㅋㅋ

댓글남기기