본문 바로가기

카테고리 없음

Algorithm2 [공부 : 행렬의 곱셈]

문제 설명

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]]

 

 

행렬의 곱셉방법

Logic
result의 행의 길이 ===  arr1의 행의 길이 
result의 열의 길이 === arr2의 열의 길이
arr1의 행(row, y)과 arr2의 열(col,x)의 대응되는 곱셉의 합
// (y,x)
// (row, col)

function solution(arr1, arr2) {
  // result의 크기
  const [row, col] = [arr1.length, arr2[0].length];
  console.log('row:', row);
  console.log('col:', col);

  // result배열 만들기
  let result = new Array(row);
  console.log('result:', result);
// (y,x)
// (row, col)

  for (let i = 0; i < row; i++) {
    result[i] = new Array(col);
    console.log('result in for:', result);
  }

  // arr1의 열의 개수 === arr2의 행의 개수,
  // arr1의 i번째 행과 arr2의 j번째 열의 원소들을 곱한 것들의 합이
  // result[i][j] 값
  for (let i = 0; i < row; i++) {
    for (let j = 0; j < col; j++) {
      result[i][j] = arr1[i].reduce((sum, arr1Value, rowIndex) => {
        console.log(`arr1[${i}]`);
        console.log('sum:', sum);
        console.log('arr1Value:', arr1Value);
        console.log('rowIndex:', rowIndex);
        return sum + arr1Value * arr2[rowIndex][j];
      }, 0);
    }
  }
  return result;
}
정확성  테스트
테스트 1 〉	통과 (3.70ms, 32.2MB)
테스트 2 〉	통과 (26.20ms, 33.8MB)
테스트 3 〉	통과 (26.17ms, 34.1MB)
테스트 4 〉	통과 (0.78ms, 30.4MB)
테스트 5 〉	통과 (14.71ms, 34.2MB)
테스트 6 〉	통과 (12.85ms, 34MB)
테스트 7 〉	통과 (1.17ms, 30.5MB)
테스트 8 〉	통과 (0.70ms, 30.1MB)
테스트 9 〉	통과 (0.37ms, 30.1MB)
테스트 10 〉	통과 (14.92ms, 33.8MB)
테스트 11 〉	통과 (4.26ms, 32.2MB)
테스트 12 〉	통과 (1.01ms, 30.2MB)
테스트 13 〉	통과 (9.43ms, 33.8MB)
테스트 14 〉	통과 (16.38ms, 33.8MB)
테스트 15 〉	통과 (5.32ms, 32MB)
테스트 16 〉	통과 (3.70ms, 32.7MB)

 

가로/세로, 행/열, x/y는 순서가 매번 헷갈리는 것같다...