본문 바로가기
알고리즘/프로그래머스

[프로그래머스] Lv.2 행렬의 곱셈 문제

by 줍 2024. 4. 11.

1. 두번째 행렬의 전치행렬을 구해야겠다는 것이 처음 아이디어였다. 시도는 좋았으나 코드 가독성이 떨어지고 그닥 직관적이지 않다.

func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
    var newArr = [[Int]]()
    for i in 0..<arr2[0].count {
        var new = [Int]()
        for arr in arr2 {
            new.append(arr[i])
        }
        newArr.append(new)
    }
    var outer = [[Int]]()
    for i in arr1 {
        var inner = [Int]()
        for j in newArr {
            var sum = 0
            for (x, y) in zip(i, j) {
                sum += x * y
            }
            inner.append(sum)
        }
        outer.append(inner)
    }
    return outer
}

 

2. 다른 풀이

결과 행렬의 크기에 해당하는 배열을 만들어둔 다음, 행렬 곱셈의 정의를 이용하는 방법. 행렬 곱셈을 제대로 이해하고 있다면 이렇게 풀이하는 것이 훨씬 깔끔하고 직관적이다.

func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
    var result = [[Int]](repeating: [Int](repeating: 0, count: arr2[0].count), count: arr1.count)
    
    for i in 0..<arr1.count {
        for j in 0..<arr2[0].count {
            for k in 0..<arr1[0].count {
                result[i][j] += arr1[i][k] * arr2[k][j]
            }
        }
    }
    return result
}