문제 내용
Matrix Dot(곱)을 연산 하시오
접근 방법
기본적인 수학 문제이다.
그런데 의외로 이런 문제를 코드로 변환 시키려고 보면 머리가 멈춘다.
아... 진짜 그냥 바보같다.
아무튼 다음과 같은 접근 방식으로 풀었다.
- A 배열을 arows * acols, B배열을 brows * bcols 라고 명명할 수 있다.
- acols와 brows의 크기가 같아야 곱셈이 가능하다
- 결과 배열은 arows * bcols가 된다.
위의 3가지를 이용해서 문제를 접근했는데,
기본적인 loop를 어떻게 돌것이냐? 가 가장 중요한 첫번째 step이다.
A배열을 loop 시킬까? 아니면 B배열을 loop 시킬까?
결론은 Result 배열인 arow * bcols를 loop 시켜야 한다.
결국 result[arow][bcols] 에 각 A의 Col과 B의 Row가 곱해서 Sum이 되기 때문이다.
그래서
for arows inc
for bcols inc
result[arows][bcols] = A[arow][??] * B[??][bcols]
를 기본 코드로 두었다.
위의 ?? 부분은 aclos와 brows의 길이가 같기때문에 해당 길이만큼 순환 시켜주면 목표한 result[arows][bcols]에 곱셈이 되어서 더해질 수 있다.
만들어진 코드는 아래와 같다.
var multiply = function(mat1, mat2) {
let result = new Array(mat1.length).fill(0).map(_=> new Array(mat2[0].length).fill(0));
for(let arow = 0; arow < mat1.length; arow++){
for(let bcol = 0; bcol < mat2[0].length; bcol++){
for(let brow = 0; brow < mat2.length; brow++){
result[arow][bcol] += mat1[arow][brow] * mat2[brow][bcol];
}
}
}
return result;
};
혹시 위 코드가 최적화 코드가 아닌가 해서 다른 사람코드를 찾아봤는데, 이게 최적화 코드 맞았다.
위의 Matrix연산은 Concurrent 개발을 통해서
for(let brow = 0; brow < mat2.length; brow++){
result[arow][bcol] += mat1[arow][brow] * mat2[brow][bcol];
}
이 부분을 동시 계산 가능하도록 만들 수 있다.
이 내용을 참고하면 좋다.
728x90
반응형
'Problem Solving' 카테고리의 다른 글
Masking을 활용한 DP 문제 풀기 (Partition to K Equal Sum Subsets) (0) | 2021.09.12 |
---|---|
Jump Game II (0) | 2021.08.30 |
Javascript 32bit 이상 Number&Integer 계산하기 (BigInt) (1) | 2021.08.14 |
Longest Repeating Character Replacement (0) | 2021.08.13 |
Power of Four (0) | 2021.08.13 |