Language/Swift

Swift - zip

codinglearn 2020. 7. 6. 15:03
반응형

zip(_:_:)

Creates a sequence of pairs built out of two underlying sequences.

 

두 개의 기본 시퀀스로 만들어진 시퀀스 쌍을 만듭니다.

 

 

알고리즘을 풀다 두 배열의 값을 더해서 다시 배열로 만드는 문제가 있었는데 해결 하고 나니 

 

다른 분의 풀이에 zip함수를 사용하여 각독성이 더 좋아보이는 풀이를 보고 zip 함수라는 편리한 함수도 있구나 해서 알아보겠습니다.

 

아래는 공식문서의 zip함수 사용법입니다.

 

let words = ["one", "two", "three", "four"]
let numbers = 1...4

for (word, number) in zip(words, numbers) {
    print("\(word): \(number)")
}
// Prints "one: 1"
// Prints "two: 2
// Prints "three: 3"
// Prints "four: 4"
let naturalNumbers = 1...Int.max
let zipped = Array(zip(words, naturalNumbers))
// zipped == [("one", 1), ("two", 2), ("three", 3), ("four", 4)]

 

 

알고리즘에서의 문제에서 입력과 출력의 내용입니다.

arr1의 배열과 arr2의 배열에서 동일한 위치의 값 끼리 더하여 입력 받은 배열의 구조로 반환해 줘야 합니다.

let arr1 = [[1,2],[2,3]]
let arr2 = [[3,4],[5,6]]

return = [[4,6],[7,9]]

 

 

flatMap함수를 사용하여 1차원 배열로 변환이후 

forEach함수를 사용해서 각 인덱스 번호의 값끼리 더한이후에 처음 sumCount로 배열의 길이를 저장해두어 새로운 배열을 

만드는 방식으로 해결하였는데..

 

네 ... 불필요한 함수와 불필요한 작업율.. 아직 공부해야할게 많네요...

func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
    
    var resultArray = [[Int]]()
    
    let a = arr1.flatMap { $0 }
    let b = arr2.flatMap { $0 }
    
    let sumCount = arr2[0].count
    var sumArray = [Int]()
    
    a.enumerated().forEach { index, num in
        sumArray.append(num + b[index])
        if sumArray.count == sumCount {
            resultArray.append(sumArray)
            sumArray.removeAll()
        }
    }
    
    return resultArray
}

 

zip함수를 사용한 다른분의 풀이방법

 

너무 깔끔하조... 이러니 공부해야저...

 

원리는 동일하다고 생각이 되는데요.

map으로 모든 배열을 한바퀴 돌면서 다시 각 값끼리 더하여 map함수를 사용하여 동일한 배열 형식으로 반환해주는 방법입니다.

func solutionA(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] {
    return zip(arr1, arr2).map{zip($0,$1).map{$0+$1}}
}
반응형