[Algorithm] 프로그래머스 내적

Updated:

문제 설명

19

나의 풀이

import Foundation
func solution(_ a:[Int], _ b:[Int]) -> Int {
    var result = 0
    for i in 0..<a.count {
        result += a[i] * b[i]
    }
    return result
}

고민한 점

위의 풀이로 푸니까 2문제 정도가 시간초과 발생했다.

다른 풀이를 찾아보니까 zip을 사용한 풀이가 있었다.

괜찮은 남의 풀이

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

Swift공식문서를 보면 zip()은 다음과 같이 사용할 수 있다.

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

이때 sequence1과 sequence2는 시퀀스 혹은 컬렉션 타입이다. 그리고 반환 값으로 튜플쌍들의 시퀀스를 리턴한다.

let words = ["one", "two", "three", "four"]
let numbers = 1...4
let zipResult = zip(words, numbers)

for (word, number) in zipResult {
    print("\(word): \(number)")
}
// Prints "one: 1"
// Prints "two: 2
// Prints "three: 3"
// Prints "four: 4"

그리고 만약 두 개의 시퀀스의 길이가 다르다면 짧은 쪽에 맞춰서 끝나게 된다.

let words = ["one", "two", "three", "four"]
let naturalNumbers = 1...Int.max
let zipped = Array(zip(words, naturalNumbers))
// zipped == [("one", 1), ("two", 2), ("three", 3), ("four", 4)]

즉, naturalNumbers는 1부터 정수의 최대값까지이지만, words의 개수가 4개이므로 4개까지만 반환되고 끝난다.

참고

Programmers
Apple Document zip

Leave a comment