[프로그래머스] 행렬의 곱셈 (Python)

Yebin Lee·2022년 9월 30일
0

코테준비

목록 보기
12/12

매주 금요일은 공강 날 ~ ! 그런데 개강하고 단 한 번도 부지런히 보내본 적이 없는 것 같다 ,, 반성해 ㅠ 사실 공강이 있다는 건 그만큼 다른 날 수업을 더 많이 듣는다는 거니까 라는 생각으로 푹 자고 푹 쉬는 것을 목표로 했는데 현재 내 인생에 있어서 그러면 안 되는 순간이라는 걸 생각하고 또 생각한다. 그래서 ! 오늘은 부족한 잠을 채울 정도로만 자고 오전에 카페로 나왔다. 점점 잠을 줄여가야지 ...!

일을 시작하기 전에 워밍업으로 코테 문제를 하나 풀었다. 쉬워서 금방 뚝딱뚝딱 풀어낼 줄 알고 켠 문제였는데 새로운 개념을 써야 했다. 뭐 알아가는 기쁨은 좋다!


프로그래머스 [행렬의 곱셈] 문제 보기


2차 코딩테스트 통과를 위해서라도 열심히 살아야지 .. 절대 4차까지는 가고 싶지 않다.


프로그래머스 [행렬의 곱셈] 문제 풀이


import numpy as np
def solution(arr1, arr2):
    numpy1 = np.array(arr1)
    numpy2 = np.array(arr2)
    result = numpy1 @ numpy2
    return result.tolist()

numpy 는 행렬 문제를 위해서라면 꼭 알고 있어야 하는 개념 같다. 물론 이제껏 피해왔지만... 이제는 더 이상 피할 곳이 없어 !!!! 개념을 쓰면서 신기했던 점은 numpy 는 json 형태 라는 것...? 굳이 어려웠던 점을 꼽자면 list로 변환하는 과정이 다른 개념들과 달리 list(numpy) 처럼 되지 않아 애썼다는 것이다.


numpy

(1) 덧셈

import numpy as np

arr1 = np.array(
    [
        [2, 3, 2],
        [4, 2, 4],
        [3, 1, 4]
    ]
)

arr2 = np.array(
    [
        [5, 4, 3],
        [2, 4, 1],
        [3, 1, 1]
    ]
)

result = arr1 + arr2
print(result)


#result

[[7 7 5]
 [6 6 5]
 [6 2 5]]

덧셈이기 때문에 행, 열의 개수가 서로 같아야 한다는 점 주의 !


(2) 뺄셈

import numpy as np

arr1 = np.array(
    [
        [2, 3, 2],
        [4, 2, 4],
        [3, 1, 4]
    ]
)

arr2 = np.array(
    [
        [5, 4, 3],
        [2, 4, 1],
        [3, 1, 1]
    ]
)

result = arr1 - arr2
print(result)


#result

[[-3 -1 -1]
 [ 2 -2  3]
 [ 0  0  3]]

(3) 곱셈

import numpy as np

arr1 = np.array(
    [
        [2, 3, 2],
        [4, 2, 4],
        [3, 1, 4]
    ]
)

arr2 = np.array(
    [
        [5, 4, 3],
        [2, 4, 1],
        [3, 1, 1]
    ]
)

result = arr1 * arr2
print(result)


#result

[[10 12  6]
 [ 8  8  4]
 [ 9  1  4]]

(4) 나눗셈

import numpy as np

arr1 = np.array(
    [
        [2, 3, 2],
        [4, 2, 4],
        [3, 1, 4]
    ]
)

arr2 = np.array(
    [
        [5, 4, 3],
        [2, 4, 1],
        [3, 1, 1]
    ]
)

result = arr1 / arr2
print(result)


#result

[[0.4        0.75       0.66666667]
 [2.         0.5        4.        ]
 [1.         1.         4.        ]]

(5) 행렬의 곱셈

import numpy as np

arr1 = np.array(
    [
        [2, 3, 2],
        [4, 2, 4],
        [3, 1, 4]
    ]
)

arr2 = np.array(
    [
        [5, 4, 3],
        [2, 4, 1],
        [3, 1, 1]
    ]
)

result = arr1 @ arr2
print(result)


#result

[[22 22 11]
 [36 28 18]
 [29 20 14]]

일반 곱셈과는 다르게 행렬 간 곱셈 연산자는 @ 이다.
사칙연산은 두 행렬의 행과 열의 개수가 모두 같아야 하지만 행렬 간 곱셈에서는 첫번째 행렬의 열 개수와 두번째 행렬의 행 개수만 같으면 된다.

나의 경우에는 이렇게 numpy 로 계산한 값을 list 로 다시 바꿔주어야 했다.

result = np.array(
	[
        [5, 4, 3],
        [2, 4, 1],
        [3, 1, 1]
    ]
)

print(result)

#result
[[5 4 3]
 [2 4 1]
 [3 1 1]]
 
 
 
print(list(result))

#result
[array([5, 4, 3]), array([2, 4, 1]), array([3, 1, 1])]



print(result.tolist())

#result
[[5, 4, 3], [2, 4, 1], [3, 1, 1]]

그냥 list(numpy) 형태로 해주면 안됐다. numpy.tolist() 를 써주어야 했다.
앞으로는 이런 개념들을 까먹지 않고 계속 사용해야지...! 그러려고 블로그 글을 작성하는 것도 있다 ㅎㅎ 아무튼 화이또 !


안녕 !

0개의 댓글