
이 문제를 보고 고차함수를 써봐야겠다는 생각이 들었다. 그래서 맨처음에는 compactMap을 이중으로 사용해서 구현하려고 했으나 실패하고 다음과 같이 구현하였다.
func solution(_ a:[Int], _ b:[Int]) -> Int {
var index = 0
var result = a.compactMap { num1 in
var res = num1 * b[index]
index += 1
return res
}
return result.reduce(0, +)
}
나는 코드를 짤때 따로 playground 파일에 돌려보는 편인데 아래의 코드를 돌려봤을때 정상 작동하였다.

그런데 이를 프로그래머스에 제출하니까 다음과 같은 오류가 났다.

검색 해보니 이 오류는 컴파일러가 compacMap 함수의 제네릭 매개변수 'ElementOfResult'를 유추할 수 없다는 것을 의미한다. 이런 경우는 클로저 내부에서 명시적으로 반환 타입을 지정하지 않아 발생하는 경우나, compactMap의 반환 타입이 명확하지 않을때 또는 입력 타입이 예상과 다를때 발생한다.
이 에러가 발생할 경우 클로저 내부에서 반환 타입을 명시적으로 지정해주거나, compactMap 함수를 올바르게 사용했는지 검토해야 한다. 나의 경우 반환타입을 [Int]로 명시해주었다.
func solution(_ a:[Int], _ b:[Int]) -> Int {
var index = 0
var result: [Int = a.compactMap { num1 in
var res = num1 * b[index]
index += 1
return res
}
return result.reduce(0, +)
}
다른 사람들의 풀이를 보니 zip 함수를 사용해서 깔끔하게 해결한 풀이가 많았다.! (한줄이라니..물론 코드의 길이가 중요한 것은 아니지만 감탄이 나온다..!!😮)
func solution(_ a:[Int], _ b:[Int]) -> Int {
return zip(a, b).map(*).reduce(0, +)
}
고차함수 zip은 두 개의 시퀀스를 결합하여 각 시퀀스의 요소들을 순서대로 쌍으로 묶어 tuple로 반환해 준다. zip 함수는 여러 시퀀스를 한꺼번에 처리할 때 유용한 함수다.
let numbers = [1,2,3,4]
let numbers2 = [-3,-1,0,2]
let zipped = zip(numbers, numbers2)
for (zip) in zipped {
print(zip)
}
//(1, -3)
//(2, -1)
//(3, 0)
//(4, 2)
zip과 map을 이용한 풀이 같은 경우 풀어쓰면 다음과 같이 이해할 수 있겠다.
func solution(_ a:[Int], _ b:[Int]) -> Int {
return zip(a, b).map($0 * $1).reduce(0, +)
}
zip으로 두 배열을 하나의 튜플이라는 시퀀스로 만들어주고 이를 map함수를 사용해 하나의 배열로 만든 후 reduce를 통해 값을 구했다.