[프로그래머스 lev2/JS] 행렬의 곱셈

woolee의 기록보관소·2022년 10월 24일
0

알고리즘 문제풀이

목록 보기
17/178

문제 출처

프로그래머스 lev2 - 행렬의 곱셈

문제

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

나의 풀이

answer 배열을 만들 때, new Array로 배열을 미리 만들었더니 tmp 값이 이상하게 들어가서 Array from으로 만들었다. 대체 왜..!?
new Array는 생성자라서 for문에서 이상하게 들어가는 것 같기도.

어쨌든, 풀이 핵심은 index 'k'
행렬의 곱셈에선, (i x k)행렬과 (k x j) 행렬 형태가 되어야 한다.
즉, 전자 행렬의 열의 개수와 후자 행렬의 행의 개수가 같아야 곱셈이 가능하다.

j값을 제대로 빼려면, arr2[0]으로 for문을 돌려야 한다.

function solution(arr1, arr2) {
  let answer = Array.from({length:arr1.length}, () => Array.from({length:arr2[0].length}, () => 0));
  // let answer = new Array(arr1.length).fill(new Array(arr2[0].length).fill(0));
  for (let i=0; i<arr1.length; i++) {
    for (let j=0; j<arr2[0].length; j++) {
      let tmp=0;
      for (let k=0; k<arr2.length; k++) {
        tmp += arr1[i][k] * arr2[k][j];
      }
      answer[i][j]=tmp;
    }
  }
  return answer;
}

console.log(
  solution(
    [
      [2, 3, 2], 
      [4, 2, 4], 
      [3, 1, 4]], 
    [
      [5, 4, 3], 
      [2, 4, 1], 
      [3, 1, 1]]));

다른 풀이

function productMatrix(A, B) {
  return A.map(function(row) {
      return row.map(function(_, i) {
          return row.reduce(function(sum, cell, j) {
              return sum + cell * B[j][i];
          }, 0);
      });
  });
}

참고

행렬의 곱셈, 행렬의 거듭제곱

profile
https://medium.com/@wooleejaan

0개의 댓글