이번 글에서는 양수와 음수를 모두 포함하는 숫자 배열을 입력받아, 인접한 두 요소의 곱 중 가장 큰 값을 반환하는 JavaScript 함수를 작성해 보겠습니다.
문제 이해하기
배열에서 서로 붙어 있는 두 요소(인접 요소)의 곱을 모두 계산한 뒤, 그중 최댓값을 찾는 것이 목표입니다.
예를 들어 다음과 같은 배열이 주어졌다고 가정해 보겠습니다.
const arr = [-23, 4, -3, 8, -12];
이 경우 각 인접 요소 쌍의 곱은 다음과 같습니다.
- -23 × 4 = -92
- 4 × (-3) = -12
- -3 × 8 = -24
- 8 × (-12) = -96
따라서 최대 곱은 -12이며, 해당하는 두 요소는 4와 -3입니다.
const output = -12;
해결 접근 방식
가장 효율적인 방법은 배열을 한 번만 순회하면서 현재 요소와 그다음 요소의 곱을 계산하고, 지금까지 발견한 최댓값과 비교하는 것입니다. 초기값은 안전한 정수 범위의 최솟값인 Number.MIN_SAFE_INTEGER로 설정하여 어떤 곱보다도 작게 만듭니다.
코드 구현
const arr = [-23, 4, -3, 8, -12];
const adjacentProduct = (arr = []) => {
let res = Number.MIN_SAFE_INTEGER;
for (let i = 0; i < arr.length - 1; i++) {
const product = arr[i] * arr[i + 1];
if (product > res) {
res = product;
}
}
return res;
};
console.log(adjacentProduct(arr));코드 설명
res변수는 최종 결과값을 저장하며,Number.MIN_SAFE_INTEGER로 초기화합니다.- 반복문은 마지막 요소 전까지 순회하므로 조건을
i < arr.length - 1로 설정해 불필요한 연산을 줄였습니다. - 각 반복에서
arr[i]와arr[i + 1]의 곱을 계산하고, 기존 최댓값보다 크면 갱신합니다. - 모든 순회가 끝나면 최대 곱을 반환합니다.
실행 결과
위 코드를 실행하면 다음과 같은 출력을 확인할 수 있습니다.
-12
시간 복잡도
배열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 추가 메모리 사용 없이 상수 공간 O(1)로 해결할 수 있습니다. 이는 배열의 길이가 커져도 효율적으로 동작한다는 의미입니다.