TIL/알고리즘 공부

프로그래머스 Lv. 2 Swift 알고리즘 - 행렬의 곱셈

여의도사노비 2023. 1. 5. 16:23
728x90

행렬은 원래 눈으로 푸는 문제인데...

이렇게 일렬의 코드로 보니 머리가 너무 아팠다 ㅎㅎ

 

이 문제는 행렬간의 곱셈을 할 때 행렬이 어떤 특성을 지녔는지 파악하면 풀 수 있다.

물론 for문이 여러번 겹쳐서 특성을 알아도 시간이 좀 걸렸다...

 

 

 

 

이 문제를 풀면서 생각한 논리적 흐름

  1. 우선 answer를 arr1과 arr2를 곱하면 만들어지는 행렬의 형태로 만들어준다.
  2. 행렬의 특성상 앞 행렬의 열 개수와 뒤 행렬의 행 개수가 동일해야 곱셈이 된다.
  3. 그리고 곱셈이 끝나면 앞 행렬의 행 개수와 뒤 행렬의 열 개수를 곱한 형태로 바뀐다.
  4. (ex. 2x3 행렬과 3x2 행렬을 곱하면 2x2 행렬이 된다.)
  5. 이렇게 미리 만들어둔 행렬에 곱셈이 끝난 값들을 순서대로 넣어주면 된다.
  6. arr[0][0] = arr1[0][0]*arr2[0][0] + arr1[0][1]*arr2[1][0] ...
  7. 이런 식으로 arr 행렬의 각 위치에 맞게 for문을 설정해주면 끝.

 

 

* 코드

import Foundation

func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
    var answer = Array(repeating: [Int](), count: arr1.count)

    for i in 0...arr1.count-1 {
        for j in 0...arr2[0].count-1 {
            var value = 0
            for k in 0...arr2.count-1 {
                value += arr1[i][k] * arr2[k][j]
            }
            answer[i].append(value)
        }
    }
    return answer
}

 

 

정리(Today I Learned)

  1. 행렬 문제는 항상 헷갈린다. 두 가지 index가 겹치기 때문에 index 관리를 깔끔하게 하지 못하면 금방 코드가 복잡해지는 것 같다.