문제 설명
길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1]
입니다. (n은 a, b의 길이)
제한사항
입출력 예
a | b | result |
---|---|---|
[1,2,3,4] | [-3,-1,0,2] | 3 |
[-1,0,1] | [1,0,-1] | -2 |
입출력 예 설명
입출력 예 #1
1*(-3) + 2*(-1) + 3*0 + 4*2 = 3
입니다.입출력 예 #2
(-1)*1 + 0*0 + 1*(-1) = -2
입니다.풀이 과정
내적이 몽데!!!!!!!!!!! 파워 문과였던 나에게….
문제를 풀다 마주하는 이런저런 수학 개념은..너무 멀게만 느껴지고… :(
그치만 해야지. 이해 해야지!!! 풀면서 보자 :>
문제 설명을 보니, a,b에서 같은 인덱스 위치의 값을 매칭시켜 곱해주고 그 값들을 모두 더해주면 되는 것 같다. 지난 번에 사용했던 zip으로 매칭 시키고 고차함수를 사용해보자 - !
zip(a, b)
zip 을 사용해 두 배열에서 같은 인덱스 위치에 있는 값들을 매칭시킨다..map { $0 * $1 }
map을 사용해 각 인덱스의 값들을 곱한다..reduce(0, +)
reduce를 사용해 매칭 시켜 곱한 값들을 더해준다.
Solution
import Foundation
func solution(_ a:[Int], _ b:[Int]) -> Int {
return zip(a, b).map { $0 * $1 }.reduce(0, +)
}
Another Solution
아쉽다. 더 줄일 수 있었는데!!
고차함수로 각 인덱스에 위치한 값들을 곱해줄 때 클로저를 사용하지 않고 ‘*’ 연산자만 사용해도 된다..!! ㅎㅅㅎ..이걸 놓쳤어
연산자 중위 표기법 이라고 하는데, 정리를 해보았다.
연산자 중위 표기법
일반적인 수식을 표현하는 방법 중 하나로
보통 수식에서는 연산자가 피연산자 사이에 위치한다.
표현할 때 연산자의 이름을 피연산자 사이에 두고 사용할 수 있다.
{ * }
여기서는 ‘*’가 연산자이고,
중위표기법을 사용하면 일반적으로는 연산자의 두 피연산자를 자동으로 (왼쪽에서 오른쪽 순서로) 할당해준다고 한다.
자동 할당 되기 때문에 매개변수를 생략해도 왼쪽과 오른쪽 값을 곱하는 연산을 해준 것!!
import Foundation
func solution(_ a:[Int], _ b:[Int]) -> Int {
return zip(a, b).map { * }.reduce(0, +)
}
알고리즘을 달리셨군요! 쉽다가도 어려운게 알고리즘 ㅠ ZIP을 까먹고 있었는데.... 감사합니다