Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 정렬된 배열의 각 요소에 이차함수 f(x) 적용하기

문제 개요

다음과 같은 수학적 함수가 주어져 있다고 가정해 보겠습니다.

f(x) = ax² + bx + c

여기서 a, b, c는 세 개의 상수입니다.

우리가 작성해야 할 것은 JavaScript 함수입니다. 이 함수는 첫 번째 인자로 정렬된 정수 배열 arr를, 두 번째, 세 번째, 네 번째 인자로 각각 a, b, c를 받습니다.

함수는 배열 arr의 모든 요소에 f(x)를 적용한 뒤, 변환된 배열을 오름차순으로 정렬하여 반환해야 합니다.

입력 예시

const arr = [-8, -3, -1, 5, 7, 9];
const a = 1;
const b = 4;
const c = 7;

출력 예시

const output = [4, 4, 39, 52, 84, 124];

예제 코드

const arr = [-8, -3, -1, 5, 7, 9];
const a = 1;
const b = 4;
const c = 7;

const applyFunction = (arr = [], a = 1, b = 1, c = 1) => {
   const apply = (num, a, b, c) => {
      const res = (a * (num * num)) + (b * num) + c;
      return res;
   };
   const result = arr.map(el => apply(el, a, b, c));
   result.sort((a, b) => a - b);
   return result;
};

console.log(applyFunction(arr, a, b, c));

코드 설명

위 코드의 동작 과정을 단계별로 살펴보겠습니다.

  • f(x) 계산: 내부 헬퍼 함수 apply는 전달받은 숫자에 대해 ax² + bx + c 연산을 수행한 결과를 반환합니다.
  • 배열 변환: Array.prototype.map()을 사용해 원본 배열의 모든 요소에 f(x)를 일괄 적용합니다.
  • 정렬: Array.prototype.sort()에 비교 함수 (a, b) => a - b를 전달하여 숫자 기준 오름차순으로 정렬합니다. 비교 함수를 생략하면 요소가 문자열로 취급되어 잘못된 순서로 정렬될 수 있으므로 반드시 지정해야 합니다.

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

[ 4, 4, 39, 52, 84, 124 ]

추가 팁: 시간 복잡도 최적화

위 방식의 시간 복잡도는 O(n log n)입니다. 만약 입력 배열이 이미 정렬되어 있다는 조건을 활용하면 투 포인터(two-pointer) 기법으로 O(n)까지 성능을 개선할 수 있습니다. 이차함수의 그래프는 포물선 형태이므로 극값이 항상 중앙에 위치하고, 배열의 양 끝에서 계산한 값 중 하나가 최댓값(또는 최솟값)이 됩니다. 따라서 배열의 양쪽 끝부터 포인터를 이동시키며 결과 배열의 뒤쪽부터 큰 값을 채워 나가면 별도의 정렬 없이도 정렬된 결과를 얻을 수 있습니다.