https://school.programmers.co.kr/learn/courses/30/lessons/70128
두 일차원 배열의 내적을 구한다.
내적: a[0]*b[0] + a[1]*b[1] + ...
- 풀이 1
fun solution(a: IntArray, b: IntArray): Int {
var answer = 0
a.forEachIndexed { i, it -> answer += b[i] * it }
return answer }
누적합을 계산할 변수를 두고 forEachIndexed로 다른 배열의 같은 인덱스인 값과의 곱을 더해줬다.
- 타인 풀이
fun solution(a: IntArray, b: IntArray): Int =
a.mapIndexed { i, it -> b[i] * it }.sum()
이렇게 한 줄 풀이도 있었지만, 배열에 대해 map을 하고 sum을 다시 하면 배열을 두 번 탐색하므로 비효율일 것 같다.
(map이 어떻게 동작하는지 몰라 확신이 없다. 람다식과 함께 iterator로 만들어놓고 sum을 수행할 때 풀면서 동시에 계산할지도?)
- 풀이2
fun solution(a: IntArray, b: IntArray): Int =
a.foldIndexed(0) { index, acc, i -> acc + b[index] * i }
sumOf를 도입하고 싶지만, 현재 배열에 대해서만 계산하는 것이 아니라 다른 배열에 접근해야 하기에 인덱스가 필요한데, sumOf는 인덱스를 제공해주지 않는다. 대안으로 foldIndexed를 찾았다.
foldIndexed는 index, acc, i 를 매개변수로 갖는다. 누적합 변수와 인덱스, 값까지 모두 갖추고 있기에 성능을 유지하면서도 한 줄로 압축할 수 있었다.