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

JavaScript에서 배열이 나타내는 숫자보다 1 큰 수를 반환하는 방법

문제 소개

양의 정수로만 이루어진 배열 arr을 첫 번째이자 유일한 인수로 받는 JavaScript 함수를 작성해야 합니다.

이 함수는 먼저 배열에 담긴 숫자들을 하나로 이어 붙여 단일 숫자를 만든 뒤, 그 숫자보다 정확히 1 큰 값을 나타내는 새로운 배열을 반환해야 합니다.

예를 들어 함수의 입력이 다음과 같다면 −

입력

const arr = [6, 7, 3, 9];

출력

const output = [6, 7, 4, 0];

출력 설명

입력 배열이 나타내는 숫자는 6739이고, 여기에 1을 더하면 6740이 되기 때문입니다.

구현 예시

다음은 위 문제를 해결하는 코드입니다 −

const arr = [6, 7, 3, 9];
const justGreater = (arr = []) => {
    if(!arr.every(v=>v>=0) || arr.length === 0){
        return null;
    };
    if(arr.some(v=>v.toString().length > 1)){
        return null
    };
    let res =[];
    for (let i=0; i < arr.length; i += 15){
        res.push(arr.slice(i,i+15));
    };
    res[res.length-1]= res[res.length-1].join('')*1+1
    res=res.map(v=>Array.isArray(v)?v.join('')*1:v)
    return (res.join('')).split('').map(v=>v*1)
};
console.log(justGreater(arr));

출력 결과

[6, 7, 4, 0]

코드 동작 원리

코드가 어떤 순서로 동작하는지 단계별로 살펴보겠습니다.

1단계: 입력값 유효성 검사

먼저 두 가지 조건을 확인합니다. 첫째, 배열의 모든 요소가 0 이상인지 검사하고 빈 배열인 경우도 걸러냅니다. 둘째, 각 요소가 반드시 한 자리 숫자(0~9)여야 하므로 두 자리 이상의 숫자가 포함되어 있으면 null을 반환합니다. 이 검증 과정 덕분에 함수는 항상 올바른 형식의 입력에서만 동작합니다.

2단계: 15자리씩 분할 처리

JavaScript의 Number 타입은 안전하게 표현할 수 있는 최대 정수 범위(Number.MAX_SAFE_INTEGER, 약 9천조)가 정해져 있습니다. 따라서 아주 긴 배열을 그대로 하나의 숫자로 합치면 정밀도 손실이 발생할 수 있습니다. 이를 방지하기 위해 배열을 15자리씩 잘라 여러 개의 조각으로 나누어 관리합니다.

3단계: 마지막 조각에 1 더하기

숫자를 1 증가시키는 것은 사실상 맨 뒷자리에 영향을 주므로, 마지막 조각만 문자열로 합친 후 숫자로 변환해 1을 더합니다. 만약 자리 올림(예: 999 → 1000)이 발생하더라도 뒤에서 전체를 다시 이어 붙일 때 자연스럽게 처리됩니다.

4단계: 자릿수 배열로 재변환

모든 조각을 문자열로 연결한 뒤 split()으로 한 글자씩 나누고, 각 요소를 다시 숫자로 변환하여 최종적인 자릿수 배열을 반환합니다.

마무리

이 접근 방식의 핵심은 큰 숫자를 다룰 때 발생할 수 있는 정밀도 문제를 15자리 단위 분할로 회피한다는 점입니다. 덕분에 배열의 길이가 매우 길어도 안정적으로 1을 더한 결과를 얻을 수 있습니다.