포스트

197. 행렬의 덧셈


1
2
3
4
5
6
7
8
9
10
func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
    
    var answer : [[Int]] = []

    answer = zip(arr1,arr2).map{zip($0,$1).map{$0+$1}}

    
    return answer
}

zip을 사용해보려고 아래와 같이 이것저것 해보았다.

여기서 예시는 아래와 같다

1
2
var arr1 : [[Int]]= [[1, 2], [2, 3]]
var arr2: [[Int]]= [[3, 4], [5, 6]]

첫번째는 zip을 하였을때 합이 아닌 이어 붙이기와 같은 효과가 되어버렸다

1
2
3
4
5
6
print(zip(arr1,arr2).map{$0+$1}) 
//[[1, 2, 3, 4], [2, 3, 5, 6]]

print(zip(arr1,arr2).map{($0+$1).reduce(0,+)})
//[10, 16]

그래서 zip으로 먼저 arr1,arr2를 해서 확인해보면 다음과 같이나온다

1
2
3
print(zip(arr1,arr2))
//Zip2Sequence<Array<Array<Int>>, Array<Array<Int>>>(_sequence1: [[1, 2], [2, 3]], _sequence2: [[3, 4], [5, 6]])

Dictionary와 같이 되어버리기에 map으로 $0,$1을 더하면 배열 합치기의 개념으로 되어버린다.

1
2
3
4
5
let myFriends = ["Fuu", "Emma", "Jason"]
let otherFriends = ["Mike", "Luck", "Paul"]

let totalFriends = myFriends + otherFriends
print(totalFriends) // ["Fuu", "Emma", "Jason", "Mike", "Luck", "Paul"]

다만 다른건 arr1+arr2를 하면

1
2
print(arr1+arr2)
// [[1, 2], [2, 3], [3, 4], [5, 6]]

2차원 배열은 유지하되, 큰틀의 껍데기에 [3,4],[5,6] 만 추가가 된다.

그래서 zip.map{zip}을 다시 해주게 되면 아래와 같다.

1
[Swift.Zip2Sequence<Swift.Array<Swift.Int>, Swift.Array<Swift.Int>>(_sequence1: [1, 2], _sequence2: [3, 4]), Swift.Zip2Sequence<Swift.Array<Swift.Int>, Swift.Array<Swift.Int>>(_sequence1: [2, 3], _sequence2: [5, 6])]

첫번째 zip과는 달리 sequence1이 1차배열로 되어있다. 즉 zip->map->zip을 이용하여 1차배열로 전환해주는 것이다. 그리고나서 다시 map을 하게되면 클로저들끼리 이어붙여지므로 원하는 결과값이 나온다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.