[Programmers] - 행렬의 곱셈

오동훈·2021년 5월 9일
0

Programmers

목록 보기
36/64
post-thumbnail

1. Problem 📃

🙌 출처 - 프로그래머스 🙌

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

제한 조건

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

입출력 예

arr1arr2return
[[1, 4], [3, 2], [4, 1]][[3, 3], [3, 3]][[15, 15], [15, 15], [15, 15]]
[[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]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]][[5, 4], [2, 4], [3, 1]][[22, 22], [36, 28], [29, 20]]

처음에 테스트는 통과했지만, 채점 결과에서 다 틀린 결과가 나와 마지막 케이스를 추가해 인덱스 체크 해주었습니다.

2. Logic 👨‍🏫

아직 행렬의 곱셈을 잘 모른다면 다음의 링크를 이용해보세요! 🔔 행렬의 곱셈 🔔

곱셈0열1열2열
0행00 X 00
01 X 10
02 X 20
00 X 01
01 X 11
02 X 21
00 X 02
01 X 12
02 X 22
1행10 X 00
11 X 10
12 X 20
10 X 01
11 X 11
12 X 21
10 X 02
11 X 12
12 X 22
2행20 X 00
21 X 10
22 X 20
20 X 01
21 X 11
22 X 21
20 X 02
21 X 12
22 X 22

총 00 X 00 으로 4자리가 나온다고 가정한다면, 다음과 같이 3가지 특성을 가지고 있습니다.
1. 00 X 00 부분은 행의 증가에 따라 값이 증가 하는것을 볼 수 있습니다.
2. 00 X 00 부분은 행렬의 상관없이 값이 일정하게 변하는 것을 볼 수 있습니다.
3. 마지막으로 00 X 00 부분은 열과 동일하게 값이 따라 오는것을 볼 수 있습니다.

3. Code 💻

1. 내가 푼 코드

def solution(arr1, arr2):
    answer = []
    for i in range(len(arr1)):
        tmp = []
        for j in range(len(arr2[0])):        
            sum = 0
            for k in range(len(arr2)): 
                sum += arr1[i][k] * arr2[k][j]    
            tmp.append(sum)
        answer.append(tmp)
    return answer

2. 다른 사람이 푼 코드

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]

# 아래는 테스트로 출력해 보기 위한 코드입니다.
a = [ [ 1, 2 ], [ 2, 3 ]];
b = [[ 3, 4], [5, 6]];
print("결과 : {}".format(productMatrix(a,b)));

어떻게 한줄로 풀 생각을 하시는건지 되게 신기할 따름이다,,,😵

profile
삽질의 기록들🐥

0개의 댓글