프로그래머스 코딩 문제 2021/02/10 - Lv.2 행렬의 곱셈

이호현·2021년 2월 10일
0

Algorithm

목록 보기
79/138

[문제]

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

[풀이]

function solution(arr1, arr2) {
  var answer = [];
  let arr1Index = 0;
  let arr2Index = 0;
  let mulIndex = 0;
  let sum = 0;
  const mulIndexlength = arr1[0].length;
   
  while(true) {
    sum += (arr1[arr1Index][mulIndex] * arr2[mulIndex][arr2Index]);
       
    mulIndex++;
       
    if(mulIndex >= mulIndexlength) {
      if(!arr2Index) {
        answer.push([sum]);
      }
      else {
        answer[arr1Index].push(sum);
      }
           
      mulIndex = 0;
      sum = 0;
      arr2Index++;
    }
       
    if(arr2Index >= arr2[0].length) {
      arr2Index = 0;
      arr1Index++;
    }
   
    if(arr1Index >= arr1.length) {
      break;
    }
  }
 
  return answer;
}

기본적으로 행렬의 곱을 하는 방법을 알아야 함.
왼쪽 행렬 열의 수와 오른쪽 행렬 행의 수가 같아야 함.

예를 들면
[2 X 3] [3 X 2] => [2 X 2]
[3 X 3] [3 X 3] => [3 X 3]

결과 값의 행과 열의 수는 왼쪽 행렬 행의 수, 오른쪽 행렬 열의 수가 나옴.

그래서 실제로 하는 방법은 아래와 같음

1 2
3 4

5 6
7 8

위 두 행렬의 곱은

{(1 X 5) + (2 X 7)} {(1 X 6) + (2 X 8)}
{(3 X 5) + (4 X 7)} {(3 X 6) + (4 X 8)}

위 처럼 계산 되어

19 22
43 50

결과 값은 위에 같음.

반복문 중첩 안 쓰면서 수학적 계산 방법으로 로직을 짜다보니 복잡해짐.

profile
평생 개발자로 살고싶습니다

0개의 댓글