문제 소개
숫자 배열과 하나의 숫자를 입력받는 JavaScript 함수를 작성해야 합니다. 이 함수가 해결해야 할 과제는, 배열에 추가했을 때 전체 배열의 평균이 두 번째 인수로 지정한 목표 값과 정확히 일치하도록 만드는 숫자를 찾아 반환하는 것입니다.
예를 들어 배열 [4, 20, 25, 17, 9, 11, 15]의 현재 평균은 약 14.43입니다. 여기에 목표 평균을 25로 만들려면 어떤 숫자를 추가해야 할까요? 아래 코드가 바로 그 답을 계산해 줍니다.
예제 코드
const arr = [4, 20, 25, 17, 9, 11, 15];
const target = 25;
function findNumber(arr, target) {
let sum = arr.reduce((a, b) => a + b, 0);
let avg = sum / arr.length;
let next = Math.ceil((target * (arr.length + 1)) - sum);
if (next <= 0) { throw new Error(); }
return next;
}
console.log(findNumber(arr, target));
실행 결과
99
코드 동작 원리
이 알고리즘의 핵심은 수학적 관계에 있습니다. 새로운 숫자 하나가 배열에 추가되면 배열의 길이는 (length + 1)이 되고, 이때 전체 합계를 새 길이로 나눈 값이 목표 평균(target)이 되어야 합니다.
따라서 필요한 총합은 target × (배열 길이 + 1)이며, 여기서 기존 배열의 합계(sum)를 빼면 추가해야 할 숫자를 구할 수 있습니다.
- reduce(): 배열의 모든 요소를 순회하며 합계를 계산합니다.
- Math.ceil(): 계산 결과가 소수일 경우 올림하여 정수로 반환합니다.
- 유효성 검사: 계산 결과가 0 이하라면 목표 평균을 달성할 수 없으므로 에러를 발생시켜 잘못된 입력을 방지합니다.
위 예제에서는 (25 × 8) − 101 = 99가 되므로, 배열에 99를 추가하면 전체 평균이 정확히 25가 됩니다.