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}}
}
반응형