문제 설명
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한 사항
행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
곱할 수 있는 배열만 주어집니다.
입출력
arr1 | arr2 | return |
[[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]] |
코드 및 설명
def solution(arr1, arr2):
answer = []
for idx1 in range(len(arr1)):
check_arr = []
for idx2 in range(len(arr2[0])):
sum_tmp = 0
for idx3 in range(len(arr1[0])):
sum_tmp += arr1[idx1][idx3] * arr2[idx3][idx2]
check_arr.append(sum_tmp)
answer.append(check_arr)
return answer
import numpy as np
def solution(arr1, arr2):
np_arr1 = np.array(arr1)
np_arr2 = np.array(arr2)
result = np.dot(np_arr1, np_arr2)
answer = []
for data in result:
check_arr = []
for idx in range(len(data)):
check_arr.append(int(data[idx]))
answer.append(check_arr)
return answer
이 문제는 다차원 배열의 곱을 어떻게 해야하는 지 공식? 계산법? 을 알아야 풀 수 있다.
위 이미지를 보면 A 열의 값과 B의 행의 값을 차례로 곱하고 더한 값이 배열의 곱의 값이 된다.
C[i][j] = A[i][1] * B[1][j]
이런식으로 구해야한다. 첫번째 위 코드는 3중 for문을 돌려서 구하는 방식이고, 두번째 코드는 numpy를 이용하여 푸는 방식이다. 첫 번째는 arr1 : [[1, 4], [3, 2], [4, 1]], arr2 : [[3, 3], [3, 3]] -> arr1[0][0]의 값이 1과 arr2[0][0]을 곱하면 3, arr1[0][1]과 arr2[1][0]을 곱하면 12이다. 이걸 더 한 값이 15, 그 다음 arr1[0][0]과 arr2[0][1]을 곱하면 3이고, arr1[0][1]과 arr2[1][1]을 곱하면 12이다. 이걸 더 한 값이 15, 결과적으로 answer[0]는 [15,15]가 된다. 이걸 반복하면 된다.
두번째는 numpy를 이용하기 때문에 numpy타입으로 배열을 정의해주고, dot이라는 numpy 내장 함수를 이용하여, 배열의 곱 값을 만들어 낸다. result 값을 그대로 넘기면, 형이 안 맞다는 에러가 나오게 되는 데 타입을 보면 ndarray여서 그렇다. 그래서 for문을 이용하여 재 배열해주고 값을 넘겨준다.
알고리즘을 풀기 위해서 배경지식들이 필요한 것 같다... 아직 부족하지만 계속 문제를 접하다보면 경험이 쌓일 것 같다!!!
'삽집하는 개발들 > 알고리즘' 카테고리의 다른 글
[74일차][Lv0][프로그래머스][누적합][120923]연속된 수의 합 (0) | 2023.11.12 |
---|---|
[73일차][Lv2][프로그래머스][스택/큐][42586]기능개발 (41) | 2023.11.09 |
[71일차][Lv2][프로그래머스][정렬][42747]H-Index (7) | 2023.11.03 |
[70일차][Lv2][프로그래머스][깊이/너비 우선 탐색(DFS/BFS][43165]타겟 넘버 (56) | 2023.10.28 |
[69일차][Lv2][프로그래머스][월간 코드 챌린지 시즌3][87390]n^2 배열 자르기 (60) | 2023.10.24 |