[programmers] 행렬의 곱셈

Gomao·2023년 3월 17일
0

코딩테스트 준비

목록 보기
11/20

프로그래머스 Lv.2 행렬의 곱셈

문제 분석
이 문제는 사실 매우 직관적이고 간단한 문제이나..
개념 자체가 기억이 가물가물하여 오래 걸리기도 했고,
또 새로 배운 스킬이 있어 포스팅을 하기로 하였다.

문제 분석은 필요하지 않다. 단순히 2차원 행렬의 곱셈이다.

제출한 코드

def solution(arr1, arr2):
    # 새 행렬의 크기를 미리 만들어줌
    # 원 행렬이 n*m, m*k 이면 n*k배열이 만들어짐
    answer = [[0 for _ in range(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])):
                answer[i][j] +=  arr1[i][k] * arr2[k][j]
    return answer

아이디어

기본적으로 미리 정답이 될 빈 배열을 만들어준다.

이때
1. [[0]*n for _ in range(m)]과
2. [[0]*n]*m 의 차이를 알아야 한다.

1번은 배열 안에 2차원 배열을 선언하고,
2번은 각각 배열들을 선언한다.
=> 2번으로 선언할 경우, 모든 배열에 동시에 값을 넣게 됨.

그 이후 풀이는 단순히 수학적 원리에 따라 풀면 된다.
1. arr1의 행 갯수를 기준으로 연산하되
2. answer 행렬의 i,j원소는 위 사진과 같이,
   arr1배열의 i,k원소, arr2배열의 k,j원소의 곱의 합과 같다.

더 이상의 논리는 필요하지 않다.

다른 사람의 풀이

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]
음..
조금 해석하는 데 시간이 걸릴 듯 하다.
profile
코딩꿈나무 고마오

0개의 댓글