문제 개요
다음과 같은 수학적 함수가 주어져 있다고 가정해 보겠습니다.
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)까지 성능을 개선할 수 있습니다. 이차함수의 그래프는 포물선 형태이므로 극값이 항상 중앙에 위치하고, 배열의 양 끝에서 계산한 값 중 하나가 최댓값(또는 최솟값)이 됩니다. 따라서 배열의 양쪽 끝부터 포인터를 이동시키며 결과 배열의 뒤쪽부터 큰 값을 채워 나가면 별도의 정렬 없이도 정렬된 결과를 얻을 수 있습니다.