알고리즘 문제풀이/프로그래머스
[프로그래머스] 행렬의 곱셈 - 파이썬(python)
mine*
2024. 1. 10. 15:12
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한 조건
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
행렬의 곱셈이란?
- 이 문제를 쉽게 풀기 위해서는 행렬의 곱셈을 어떻게 하는지 아는 것이 필요하다.
- 행렬 A(XxY)와 행렬 B(YxZ)를 곱할 때 중요한 것은 Y값이 같아야 한다는 점이다.
- 아래의 그림과 같이 A의 가로줄과 B의 세로줄을 계산하여 행렬의 곱셈을 구할 수 있다.

풀이 설계
- for문으로 돌아가면서 차례대로 answer 배열을 만든다.
- answer 배열은 arr1의 행(가로) x arr2의 열(세로)로 만들어진다.
- answer을 구성하는 값은 각각을 곱한 값의 합이므로 합을 구할 for문은 arr1의 열(세로)이자 arr2의 행(가로)이다.
- for문을 3번 실행하여 answer를 구한다.
- 합을 구하는 공식은 arr1[i][k]*arr2[k][j]
풀이
def solution(arr1, arr2):
answer = []
for i in range(len(arr1)):
tm = []
for j in range(len(arr2[0])):
summ = 0
for k in range(len(arr1[0])):
summ += arr1[i][k]*arr2[k][j]
tm.append(summ)
answer.append(tm)
return answer
다른 풀이
- 삼중for문이 좋은 방법인가라는 생각에 다른 풀이를 찾아봤더니 zip을 사용한 풀이를 발견했다.
- 결론적으로 시간적으로 볼 때는 큰 차이가 없는거 같다.
- zip을 사용해서 행과 열을 바꾸어 곱하고 합한 값으로 결과를 도출하는 방법이다.
def productMatrix(X, Y):
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]
return result


후기
- 행렬의 곱셈을 어떻게 하더라... 부터 막혀서 공식을 찾아봤다.
- 초반에 어느값을 곱하고 더하는지 헷갈려서 그렇지 문제 자체는 쉬운 것 같았다.
- zip에 대해 알게 되었다.