[프로그래머스] 레벨2 (level2) 행렬의 곱셈
2020년 05월 20일, 08:49
행렬의 곱셈
문제 설명
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]]
문제풀이
행렬의 곱셈은 어렵지 않았는데, 이제 결과값을 어떻게 만드냐 여기서 살짝 헷갈렸던 것 같다.
arr1 = [[1,4],[3,2],[4,1]], arr2 = [[3,3],[3,3]]가 주어진다고 가정하고, 행렬은 3x2 2x2 과 같이 2가 있는 자리의 수가 일치해야 곱셈이 가능하다.
-
1 4 3 3 두 개의 행렬을 곱할때, 파란 색의 숫자와 빨간 색의 숫자를 곱한 값이, 3 2 * 3 3 4 1
15 0 자리의 값이 된다. 0 0 0 0
1 4 3 3 3 2 * 3 3 4 1
15 0 15 0 0 0
- 위 과정을 반복하면 행렬의 곱셉의 값을 가질 수 있다.
- arr1을 차례대로 돌려주는 for문이 필요.
- 그리고 arr2 배열의 원소의 인덱스가 필요.(arr2는 세로줄이 필요하기 때문.)
- arr2 배열 원소의 길이만큼 for문(index)을 돌면서, arr1 배열 원소와 arr2의 원소들의 index와 곱한다.
- 그리고, 결과값을 저장하는 배열은 answer[index]배열이 존재 하면, answer[index].push하고,
아니라면, answer.push([곱한 값])을 넣어주면 된다.
function solution(arr1, arr2) {
var answer = [];
for (let j = 0; j < arr2[0].length; j++) {
for (let i = 0; i < arr1.length; i++) {
let total = 0;
arr1[i].forEach((e, idx) => {
total += e * arr2[idx][j];
});
if (answer[i]) answer[i].push(total);
else answer.push([total]);
}
}
return answer;
}
아쉬운 점 || 느낀 점
솔직히 어렵지 않다고 적어놓긴 했는데, 헷갈려서 시간이 오래걸렸다..
for문이 여러개라서 순서를 정하는 게 애먹었고, 결과값을 어떻게 넣어야하나? 이 부분도 고민했다.
갈 길이 먼 것 같다..