[알고리즘] 내적

이유진·2024년 4월 16일
2

알고리즘

목록 보기
32/32

문제 설명

길이가 같은 두 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의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

입출력 예

abresult
[1,2,3,4][-3,-1,0,2]3
[-1,0,1][1,0,-1]-2

입출력 예 설명

입출력 예 #1

  • a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3 입니다.

입출력 예 #2

  • a와 b의 내적은 (-1)*1 + 0*0 + 1*(-1) = -2 입니다.

풀이 과정

내적이 몽데!!!!!!!!!!! 파워 문과였던 나에게….
문제를 풀다 마주하는 이런저런 수학 개념은..너무 멀게만 느껴지고… :(
그치만 해야지. 이해 해야지!!! 풀면서 보자 :>

문제 설명을 보니, a,b에서 같은 인덱스 위치의 값을 매칭시켜 곱해주고 그 값들을 모두 더해주면 되는 것 같다. 지난 번에 사용했던 zip으로 매칭 시키고 고차함수를 사용해보자 - !

  1. zip(a, b) zip 을 사용해 두 배열에서 같은 인덱스 위치에 있는 값들을 매칭시킨다.
  2. .map { $0 * $1 } map을 사용해 각 인덱스의 값들을 곱한다.
  3. .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, +)
}

2개의 댓글

comment-user-thumbnail
2024년 4월 16일

알고리즘을 달리셨군요! 쉽다가도 어려운게 알고리즘 ㅠ ZIP을 까먹고 있었는데.... 감사합니다

답글 달기
comment-user-thumbnail
2024년 4월 17일

역시 알고리즘...어렵네여ㅠㅠ 연산자 중위표시법 처음보는데 새로운거 공부해갑니당 최고 bb

답글 달기