티스토리 뷰

문제 설명

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

제한 조건

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

나의 풀이

코드 작성에 앞서 행렬의 곱셈 방법을 먼저 알아야한다.
라떼 수능엔 행렬이 존재해서 희미한 기억으로 남아있지만 근 몇년간 쓴 적이 없으니 다시 행렬의 곱셈에 대해 찾아봤다.

https://mathbang.net/562
이 글을 참고하여 공책에 예시에 대한 행렬곱을 먼저 풀어봤다.
풀다보니 흐름이 읽혔고 이제 코드를 짠다.

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

    return result
}

열의 곱셈을 위해 for문을 무려 3번이나 돌렸다… ㅎ
곱셈 후의 값을 temp 배열에 쌓고 해당 열의 곱이 완성되면 result에 배열을 쌓는 방식으로 풀었다.

다른 사람의 풀이

function solution(arr1, arr2) {
    return arr1.map((row) => arr2[0].map((x,y) => row.reduce((a,b,c) => a + b * arr2[c][y], 0)))
}

속도가 확연하게 빨라진건 아니지만 map 함수, reduce 함수를 통해 좀 더 간결한 코드를 작성하셔서 퍼왔다.