ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_23.11.23 // Programmers_월간 코드 챌린지 시즌1 > 내적
    AIL( Algorithm I Learned) 2023. 11. 23. 11:19

    ## AIL_월간 코드 챌린지 시즌1 > 내적

    ***문제 설명
    길이가 같은 두 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 이하입니다.

    ***입출력 예
    a b result
    [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 입니다.

    ## solution.JavaScript

    1. 문제의 접근 방식

    주어진 문제는 두 대의 같은 길이를 갖는 배열 `a`와 `b`의 내적을 구하는 문제입니다. 내적은 각 배열의 원소를 같은 인덱스끼리 곱한 후, 그 결과들을 모두 더한 값입니다.  


    2. 문제풀이

    function solution(a, b) {
        // 내적을 저장할 변수 answer 초기화
        let answer = 0;
        
        // 주어진 배열의 길이만큼 반복하면서 내적 계산
        for (let i = 0; i < a.length; i++) {
            answer += a[i] * b[i]; // 각 배열의 같은 인덱스의 값들을 곱하여 answer에 더함
        }
        
        return answer; // 최종적으로 계산된 내적 값 반환
    }
    
    /*
    테스트 1
    입력값 〉	[1, 2, 3, 4], [-3, -1, 0, 2]
    기댓값 〉	3
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	[-1, 0, 1], [1, 0, -1]
    기댓값 〉	-2
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1. `solution` 함수는 `a`와 `b`를 매개변수로 받습니다.

     

    2. `answer` 변수를 0으로 초기화합니다. 이 변수는 내적 값을 저장하는 곳입니다. 

     

    3. 'for' 반복문을 사용하여 배열의 길이만큼 반복합니다. 

     

    4. 반복문 내에서 `a[i] * b[i]`를 통해 두 배열의 같은 인덱스에 위치한 값을 곱한 후, 그 값을 `answer`에 더합니다. 

     

    5. 반복이 끝나면 최종적으로 계산된 `answer` 값을 반환합니다. (이 값은 두 배열의 내적입니다.)


    3. 다른사람의 문제풀이 및 접근방식 분석

    function solution(a, b) {
        return a.reduce((acc, _, i) => acc += a[i] * b[i], 0);
    }
    /*
    테스트 1
    입력값 〉	[1, 2, 3, 4], [-3, -1, 0, 2]
    기댓값 〉	3
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	[-1, 0, 1], [1, 0, -1]
    기댓값 〉	-2
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1. `Array.reduce() 메서드

    `reduce()` 배열의 각 요소에 대해 주어진 콜백 함수를 실행하고 하나의 단일 값으로 축소합니다. 여기서는 초기값으로 `0`을 설정하고 배열 `a`를 기반으로 `reduce()`를 수행합니다. 

     

    2. 내부 콜백함수 

    reduce()`의 콜백 함수는 네 개의 인자를 가집니다. 여기서 사용된 `_`는 현재 요소 값에 대한 인자를 무시하고, `acc`는 누적된 값을 나타내며, `i`는 현재 인덱스를 나타냅니다. 

     

    3. 내적 계산  

    `acc += a[i] * b[i]` 부분에서는 배열 `a`와 `b`의 같은 인덱스에 위치한 값들을 곱하여 `acc`에 더합니다. 이부분이 내적을 계산하는 부분입니다. 

     

    4. 초기값

    `reduce()` 메서드의 마지막 인자로 초기값으로 `0`이 사용됩니다. 내적을 시작할 때 초기 누적값으로 활용됩니다.

     


    # Array.reduce() 메서드 vs for 반복문 두 방법의 장단점

    Array.reduce() 메서드를 사용한 방법

     

    장점: 코드가 간결하며 함수형 프로그래밍의 개념을 활용하여 작성되었습니다. 한 줄로 간결하게 표현되어 가독성이 높습니다.

     

    단점: reduce() 메서드는 내부적으로 반복을 수행하며 함수 호출을 발생시킬 수 있습니다. 또한, 함수형 프로그래밍 스타일에 익숙하지 않은 개발자들이 코드를 이해하기 어려울 수 있습니다.


    for 반복문을 사용한 방법

     

    장점: 전통적인 반복문을 사용하여 코드를 작성하였기 때문에 대부분의 개발자들이 익숙한 구문입니다. 각 단계가 명시적이어서 이해하기 쉽습니다.

     

    단점: 조금 더 많은 코드를 작성해야 할 수 있고, 반복문을 직접 작성하는 것은 실수를 범할 수 있는 여지가 있습니다.

     

     

     

     

     

     

Designed by Tistory.