내적

jericho·2023년 12월 14일

PS(문제풀이)

목록 보기
7/12

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 를 매개변수로 갖는다. 누적합 변수와 인덱스, 값까지 모두 갖추고 있기에 성능을 유지하면서도 한 줄로 압축할 수 있었다.

0개의 댓글