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

[Python]Programmers 행렬의 곱셈(lv2)

jaeheon0520 2024. 3. 18. 11:24

1. 문제

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

두 행렬이 주어줄 때 행렬의 곱을 출력하는 문제이다.

 

2. 풀이

문제를 풀이하기 전에 행렬의 곱에 대해 알아보자.

 

https://namu.wiki/w/%ED%96%89%EB%A0%AC%EA%B3%B1

 

행렬곱

Matrix Multiplication 행렬 의 곱셈은 여타 행렬의 연산과 같이 '크기가 맞는' 경우에만 정의되는데

namu.wiki

 

우선 정답이 담길 배열을 0으로 초기화 해주자.

 

곱셈 결과 나오는 행렬의 크기는 (앞 행렬의 행의 수) × (뒤 행렬의 열의 수)가 된다.

 

즉, 앞 행렬의 크기가 m×n이고 뒷 행렬의 크기가 n×r인 경우, 곱셈 결과 나오는 행렬의 크기는 m×r이 된다.

 

그 후에 행렬의 곱 공식에 맞춰서 각 행렬에 들어갈 값을 계산한다.

 

3중 반복문을 활용하여 3개의 index를 활용하였다.

 

행렬은 직사각형으로 행 간의, 열 간이 길이는 일정하기 때문에 arr1[0]의 길이를 구하면 arr1 모든 열의 길이를 구할 수 있다.

3. 코드

나의 풀이:

def solution(arr1, arr2):
    answer = [[0]*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

 

다른 풀이:

def solution(arr1, arr2):      
    result = []     
    for arr in arr1:        
        temp = []              
        for j in range(len(arr2[0])):            
            r = 0                      
            for i, n in enumerate(arr):                
                r += n * arr2[i][j]                       
            temp.append(r)              
        result.append(temp)     
    return result