-
#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 반복문을 사용한 방법
장점: 전통적인 반복문을 사용하여 코드를 작성하였기 때문에 대부분의 개발자들이 익숙한 구문입니다. 각 단계가 명시적이어서 이해하기 쉽습니다.
단점: 조금 더 많은 코드를 작성해야 할 수 있고, 반복문을 직접 작성하는 것은 실수를 범할 수 있는 여지가 있습니다.
'AIL( Algorithm I Learned)' 카테고리의 다른 글
#AIL_23.11.27 // Programmers_두 정수 사이의 합 (1) 2023.11.27 #AIL_23.11.24 // Programmers_하샤드 수 (1) 2023.11.24 #AIL_23.11.22 // Programmers_부족한 금액 계산하기 (2) 2023.11.22 #AIL_23.11.21 // Programmers_핸드폰 번호 가리기 (1) 2023.11.21 #AIL_23.11.20 // Programmers_x만큼 간격이 있는 n개의 숫자 (2) 2023.11.20