이번 문제에서는 n개의 요소로 이루어진 배열이 주어지며, 그중 단 2개의 요소만 숫자이고 나머지는 모두 null입니다. 예를 들어 다음과 같은 형태입니다.
const arr = [null, null, -1, null, null, null, -3, null, null, null];
우리가 작성해야 할 함수는 이러한 배열을 입력받아, 주어진 두 숫자가 속한 등차수열을 완성하는 것입니다. 문제를 더 명확하게 이해하기 위해, null 값을 빈칸이라고 생각해 보세요. 빈칸에 적절한 숫자를 채워 전체 배열이 하나의 등차수열을 이루도록 만드는 것이 목표입니다.
등차수열(Arithmetic Progression)이란?
수열 또는 배열의 임의의 n번째 수가 항상 (n-1)번째 수에 일정한 상수 d를 더한 값으로 표현될 때, 그 수열을 등차수열이라고 합니다.
예시:
1, 2, 3, 4, 5, 6, 7, 8
위 수열에서는 앞선 숫자에 일정한 상수(여기서는 1)를 더할 때마다 다음 숫자가 얻어집니다.
그 외의 예시들:
1, 1, 1, 1, 1, 1, 1, 1, 1 10, 8, 6, 4, 2, 0, -2
일반적으로 이러한 수열의 첫 번째 항은 a로 표기하고, 매 항마다 일정하게 증감하는 값인 공차는 d로 표기합니다.
따라서 수열의 n번째 항을 Tn으로 나타내면 다음과 같은 공식이 성립합니다.
Tn = a + (n - 1)d
여기서 n은 해당 숫자의 1 기반 인덱스(1부터 시작하는 위치)입니다.
문제 해결 접근 방식
개념을 정리했으니, 앞서 설명한 문제에 대한 코드를 작성해 보겠습니다. 먼저 배열의 첫 번째 항(a)과 공차(d)를 찾습니다. 두 값을 구한 뒤에는 원본 배열을 순회하면서 각 인덱스에 맞는 수열의 값을 생성하면 됩니다.
핵심 아이디어는 다음과 같습니다.
- 배열을 한 번 순회하며 숫자가 아닌
null이 아닌 두 요소(첫 번째 숫자와 마지막 숫자)와 그 인덱스를 기록합니다. - 두 숫자의 값 차이를 인덱스 차이로 나누면 공차 d를 구할 수 있습니다.
- 첫 번째 숫자에서 (인덱스 × 공차)를 빼면 실제 첫 번째 항 a를 역산할 수 있습니다.
- 마지막으로
map을 사용해 모든 인덱스에 대해 a + (index × d) 값을 계산하여 완전한 등차수열을 반환합니다.
예제 코드
const arr = [null, null, -1, null, null, null, -3, null, null, null];
const arr2 = [null, null, -1, null, null, null, 12, null, null, null,
null, null, null];
const constructSeries = (arr) => {
const map = {
first: undefined,
last: undefined
};
arr.forEach((el, ind) => {
if(el !== null){
if(map['first']){
map['last'] = [el, ind];
}else{
map['first'] = [el, ind];
}
};
});
const { first, last } = map;
const commonDifference = (last[0] - first[0])/(last[1] - first[1]);
const firstElement = (first[0]) - ((first[1])*commonDifference);
return arr.map((item, index) => {
return firstElement + (index * commonDifference);
});
};
console.log(constructSeries(arr));
console.log(constructSeries(arr2));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[
0, -0.5, -1, -1.5,
-2, -2.5, -3, -3.5,
-4, -4.5
]
[
-7.5, -4.25, -1,
2.25, 5.5, 8.75,
12, 15.25, 18.5,
21.75, 25, 28.25,
31.5
]첫 번째 배열은 공차가 -0.5인 등차수열로 완성되었고, 두 번째 배열은 공차가 3.25인 등차수열로 완성된 것을 확인할 수 있습니다. 이처럼 두 개의 숫자만 있어도 공차와 첫 항을 역산하여 누락된 모든 값을 정확히 채워 넣을 수 있습니다.