[Javascript] 프로그래머스 level2 - 행렬의 곱셈

ckxo·2022년 10월 18일
0

programmers

목록 보기
12/29

문제 설명

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

제한 조건

행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
곱할 수 있는 배열만 주어집니다.

입출력 예

코드

function solution(arr1, arr2) {
    var answer = [[]];
    
    for(let i=0; i<arr1.length; i++){
        let result=[];
        for(let j=0; j<arr2[0].length; j++){
            let temp=0;
            for(let k=0; k<arr2.length; k++){
                temp+=parseInt(arr1[i][k])*parseInt(arr2[k][j]);
            }
            result.push(temp);
        }
        answer.push(result);
    }
    answer.shift();
    return answer;
}

풀이

해당 문제에서는 총 세 번의 for문을 사용해야 한다.

식은 아래와 같이 진행된다.

result[0,0] = arr1[0,0]arr2[0,0] + arr1[0,1]arr2[1,0] + arr1[0,2]arr2[2,0]
result[0,1] = arr1[0,0]
arr2[0,1] + arr1[0,1]arr2[1,1] + arr1[0,2]arr2[2,1]
result[0,2] = arr1[0,0]arr2[0,2] + arr1[0,1]arr2[1,2] + arr1[0,2]*arr2[2,2]

arr1은 반복문이 돌아갈 때마다 두 번째 숫자가 1씩 변하고, 첫 번째 숫자는 고정적이다.
따라서 i와 k를 사용하면 된다.

arr2는 반복문이 돌아갈 때마다 두 번째 숫자는 그대로지만 첫 번째 숫자가 1씩 올라가므로 arr1에 쓰인 k를 먼저 써주고,
k반복문이 다 돌아가고 나면 그제서야 첫 번째 숫자가 변하므로 j를 사용해준다.

결론적으로

for(i=0; i<arr1.length; i++)
for(j=0; j<arr2[0].length; j++)
for(k=0; k<arr2.length; k++)

이처럼 진행된다.

또한 result가 각 한 줄씩 모여 answer을 이루게끔 코드를 작성하였다.

k 반복문이 한 번 다 돌고 나면 구해진 값(temp)을 result에 넣어주고, 완성된 result배열을 answer에 넣어준 후 result는 다시 초기화해주는 방법을 반복한다.

그런데 출력을 해보니 answer의 맨 앞 요소가 빈칸([])으로 들어있는 것을 확인했다.

그래서 shift()를 이용해 가장 첫 번째 요소를 삭제해주었다.

0개의 댓글