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

JavaScript 배열에서 누락된 숫자를 등차수열로 완성하는 방법

이번 문제에서는 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인 등차수열로 완성된 것을 확인할 수 있습니다. 이처럼 두 개의 숫자만 있어도 공차와 첫 항을 역산하여 누락된 모든 값을 정확히 채워 넣을 수 있습니다.