👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

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

728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/12949?language=swift# 

 

코딩테스트 연습 - 행렬의 곱셈

[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

programmers.co.kr

 

행렬의 곱셈을 코드로 나타내보는 문제.

기본적으로 행렬의 곱셈에 대해서는 알고 있을 거라 생각하고 진행해본다. 

(다 알겠지만 행렬의 곱이 성립하려면 (m x n) * (n x p)처럼 n만 같으면 된다는 건 인지하고 시작하자.)

 

1. 우변에 곱해줄 행렬의 행과 열을 바꿔준다.

2. 좌변의 행렬 원소와 1번의 결과를 zip하여 곱하고 합을 구한다. 

 

바로 코드로 보자 

 

import Foundation

func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
    // 1. 우변의 행렬 행 <-> 열 바꾸기
    var arrcol = [[Int]]()
    for j in 0..<arr2[0].count {
        var temp = [Int]()
        for i in 0..<arr2.count {
            temp.append(arr2[i][j])
        }
        arrcol.append(temp)
    }
    
    // 2. 좌변 행렬의 원소와 우변 행렬의 원소 zip하여 곱, 셈 계산
    var res = [[Int]]()
    for l in arr1 {
        var sub = [Int]()
        for r in arrcol {
            sub.append(zip(l,r).map {$0 * $1}.reduce(0,+))
        }
        res.append(sub)
    }
    return res
}

 

행렬을 뒤집을 줄 알고, 원소들끼리 곱해줄 수 있으면 풀 수 있는 문제. 

한 꺼번에 해결하기 보다는 차근차근 접근하는 방식으로 풀이하였다. 

밤에 문제를 풀다보면 자꾸 index가 헷갈린다.. 행인지.. 열인지..

집중해서 풀자!!

 

끄읕

 

728x90
반응형