정수로 이루어진 배열이 주어졌을 때, 서로 인접한 두 요소의 곱이 가장 큰 쌍을 찾아 그 곱을 반환하는 문제는 코딩 테스트에서 자주 등장하는 기본적인 알고리즘입니다.
문제 정의
배열 내에서 이웃한 두 요소를 차례대로 곱한 값들 중 최댓값을 구하는 것이 목표입니다.
예를 들어 다음과 같은 배열이 주어졌다고 가정해 보겠습니다.
const arr = [3, 6, -2, -5, 7, 3];
이 경우 출력값은 21이 되어야 합니다. 그 이유는 [7, 3] 쌍의 곱(7 × 3 = 21)이 다른 어떤 인접 요소 쌍의 곱보다 크기 때문입니다.
예제 코드
다음은 위 문제를 해결하는 자바스크립트 코드입니다.
const arr = [3, 6, -2, -5, 7, 3];
const adjacentElementsProduct = (arr = []) => {
let prod, ind;
for (ind = 1; ind < arr.length; ind++) {
if (ind === 1 || arr[ind - 1] * arr[ind] > prod) {
prod = arr[ind - 1] * arr[ind];
};
};
return prod;
};
console.log(adjacentElementsProduct(arr));
코드 동작 원리
이 알고리즘은 다음과 같은 단계로 동작합니다.
- 인덱스 1부터 시작해 배열의 마지막 요소까지 순회합니다.
- 각 위치에서 현재 요소(arr[ind])와 바로 앞 요소(arr[ind - 1])의 곱을 계산합니다.
- 첫 번째 반복(ind === 1)이거나 새로 계산된 곱이 기존 최댓값(prod)보다 크면 prod를 갱신합니다.
- 순회가 종료되면 누적된 최대 곱을 반환합니다.
배열을 한 번만 순회하므로 시간 복잡도는 O(n)으로 매우 효율적이며, 추가 메모리 사용 없이 상수 공간(O(1))으로 해결할 수 있습니다.
출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
21