TIL/알고리즘 공부
프로그래머스 Lv. 2 Swift 알고리즘 - 행렬의 곱셈
여의도사노비
2023. 1. 5. 16:23
728x90
행렬은 원래 눈으로 푸는 문제인데...
이렇게 일렬의 코드로 보니 머리가 너무 아팠다 ㅎㅎ
이 문제는 행렬간의 곱셈을 할 때 행렬이 어떤 특성을 지녔는지 파악하면 풀 수 있다.
물론 for문이 여러번 겹쳐서 특성을 알아도 시간이 좀 걸렸다...
이 문제를 풀면서 생각한 논리적 흐름
- 우선 answer를 arr1과 arr2를 곱하면 만들어지는 행렬의 형태로 만들어준다.
- 행렬의 특성상 앞 행렬의 열 개수와 뒤 행렬의 행 개수가 동일해야 곱셈이 된다.
- 그리고 곱셈이 끝나면 앞 행렬의 행 개수와 뒤 행렬의 열 개수를 곱한 형태로 바뀐다.
- (ex. 2x3 행렬과 3x2 행렬을 곱하면 2x2 행렬이 된다.)
- 이렇게 미리 만들어둔 행렬에 곱셈이 끝난 값들을 순서대로 넣어주면 된다.
- arr[0][0] = arr1[0][0]*arr2[0][0] + arr1[0][1]*arr2[1][0] ...
- 이런 식으로 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)
- 행렬 문제는 항상 헷갈린다. 두 가지 index가 겹치기 때문에 index 관리를 깔끔하게 하지 못하면 금방 코드가 복잡해지는 것 같다.