[프로그래머스] 레벨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.  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
  2. 위 과정을 반복하면 행렬의 곱셉의 값을 가질 수 있다.
  3. arr1을 차례대로 돌려주는 for문이 필요.
  4. 그리고 arr2 배열의 원소의 인덱스가 필요.(arr2는 세로줄이 필요하기 때문.)
  5. arr2 배열 원소의 길이만큼 for문(index)을 돌면서, arr1 배열 원소와 arr2의 원소들의 index와 곱한다.
  6. 그리고, 결과값을 저장하는 배열은 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문이 여러개라서 순서를 정하는 게 애먹었고, 결과값을 어떻게 넣어야하나? 이 부분도 고민했다.
갈 길이 먼 것 같다..