# Daily Codewars #22
# Question
codewars link (opens new window) Write a function that accepts two square (nxn) matrices (two dimensional arrays), and returns the product of the two. Only square matrices will be passed in.
How to multiply two square matrices:
We are given two matrices, A and B, of size 2x2 (Kata tests are not limited to 2x2). Matrix C, the solution, will be equal to the product of A and B. To fill in cell [ 0 ][ 0 ] of matrix C, you need to compute: A[0][0] * B[0][0] + A[0][1] * B[1][0].
More general: To fill in cell [ i ][ j ] of matrix C, you need to first multiply the elements in the i'th row of matrix A by the elements in the j'th column of matrix B, then take the sum of all those products. This will give you the value for cell [ i ][ j ] in matrix C.
# Example(Matrix A * Matrix B = Matrix C): |1 2| |3 2| * |3 2| |1 1|
|5 4 | |11 8|
Calculating the above C values:
C[0][0] = A[0][0] * B[0][0] + A[0][1] * B[1][0] = 1 * 3 + 2 * 1 = 5
C[0][1] = A[0][0] * B[0][1] + A[0][1] * B[1][1] = 1 * 2+ 2 * 1 = 4
C[1][0] = A[1][0] * B[0][0] + A[1][1] * B[1][0] = 3 * 3 + 2 * 1 = 11
C[1][1] = A[1][0] * B[0][1] + A[1][1] * B[1][1] = 3 * 2 + 2 * 1 = 8
Link to Wikipedia (opens new window) explaining matrix multiplication (look at the square matrix example):
n차원 배열의 곱을 구하는 문제이다.
# My Solution
function matrixMultiplication(a, b){
var mul = [];
var len = a.length;
for(i=0; i<len; i++){
var row = [];
for(j=0; j<len; j++){
var x = 0;
for(k=0; k<len; k++) x += a[i][k]*b[k][j];
row.push(x);
}
mul.push(row);
}
return mul;
}
for문을 세번 돌렸다. 가장 기초적이게 푼 느낌.
# @FunGuy's Solution
function matrixMultiplication(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);
});
});
}
[[1, 2], [3, 2]], [[3, 2], [1, 1]]를 예로 들어보자. a배열에 하나씩 map을 돌리면, [1,2]와 [3,2]에 각각 적용되는 것이다. 그리고 그 [1,2]에 또 map을 해주며, 인자는 _와 index를 넘긴다.(앞에걸 쓰지 않을때 _라고도 쓰는구나.) 그리고 거기서 0부터 시작하는 reduce를 적용해주는데,
2번째맵: [1,2] => 0+1*b[0][0] + 2*b[0][1]
=> 0+1*b[0][1] + 2*b[1][1]
[3,2]=> 이하 동일
이렇게 해주는 것이다. 계속 return문으로 넣어주며 구조를 그대로 이어가며. 좋은 방법이다!!