참조

프로그래머스에서 내적 구하는 문제 풀었는데 (물론 쉬웠음), 이걸 어떻게 하면 더 간단하게 풀까 하며 다른 사람의 풀이를 참고하였다. 그런 와중에 zip()이라는 함수를 알게 되었는데 쏘어메이징 유레카 이마를 딱 칠 정도로 신박해서 기록 남기려고 이 글 쓴다.

1️⃣ zip(::)

두 개의 기본 시퀀스로 구성된 일련의 쌍을 만드는 함수

Declaration

func zip<Sequence1, Sequence2>(_ sequence1: Sequence1, _ sequence2: Sequence2) -> Zip2Sequence<Sequence1, Sequence2> where Sequence1 : Sequence, Sequence2 : Sequence

Parameter

Sequence1: zip할 첫번째 시퀀스 또는 콜렉션

Sequence2: zip할 두번째 시퀀스 또는 콜렉션

Return Value

튜플 쌍의 시퀀스. 여기서 각 쌍의 요소는 sequence1 및 sequence2의 해당 요소

2️⃣ 코드

  • 크기가 같은 배열을 동시에 묶을 수 있기 때문에 동시에 해당 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)]
  • zip으로 내적 구하기
import Foundation

func solution(_ a:[Int], _ b:[Int]) -> Int {
    return zip(a, b).map(*).reduce(0, +)
}