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

자바스크립트(JavaScript)로 가장 가까운 갭풀(Gapful) 숫자 찾기

갭풀(Gapful) 숫자란?

갭풀 숫자는 다음 두 조건을 모두 만족하는 수를 말합니다.

  • 최소 세 자리 이상의 숫자로 이루어져 있고,
  • 첫 번째 자리 숫자와 마지막 자리 숫자를 이어 붙여 만든 수로 나누었을 때 나머지가 0이 됩니다.

예를 들어 살펴보겠습니다.

1053은 네 자리 숫자이며, 첫 자리와 끝 자리를 이어 붙인 13으로 정확히 나누어 떨어지므로 갭풀 숫자입니다. 마찬가지로 135는 세 자리 숫자이면서 15로 정확히 나누어 떨어지기 때문에 갭풀 숫자입니다.

문제 정의

이번 글에서 다룰 과제는, 입력으로 주어진 숫자에 대해 가장 가까운 갭풀 숫자를 찾아 반환하는 프로그램을 작성하는 것입니다.

예를 들면 다음과 같습니다.

  • 모든 두 자리 숫자에 대한 답은 100입니다. (100은 세 자리 숫자 중 가장 작은 갭풀 숫자)
  • 103에 대한 답은 105입니다.

해결 접근 방식

문제를 효율적으로 해결하기 위해 로직을 두 개의 함수로 분리하겠습니다.

1. isGapful() 함수

숫자 문자열을 인자로 받아 해당 숫자가 갭풀 숫자인지 여부를 불리언(Boolean) 값으로 반환하는 보조 함수입니다.

const isGapful = (numStr) => {
    const int = parseInt(numStr);
    return int % parseInt(numStr[0] + numStr[numStr.length - 1]) === 0;
};

이 함수는 문자열의 첫 글자와 마지막 글자를 연결해 새로운 수를 만든 뒤, 원래 수를 그 수로 나누어 나머지가 0인지만 확인하므로 상수 시간(O(1)) 안에 판별할 수 있습니다.

2. nearestGapful() 함수

메인 함수로, 숫자를 받아 그 숫자에 가장 가까운 갭풀 숫자를 반환합니다.

const nearestGapful = (num) => {
    if(typeof num !== 'number'){
        return -1;
    }
    if(num <= 100){
        return 100;
    }
    let prev = num - 1, next = num + 1;
    while(!isGapful(String(prev)) && !isGapful(String(next))){
        prev--;
        next++;
    };
    return isGapful(String(prev)) ? prev : next;
};

동작 방식을 정리하면 다음과 같습니다.

  • 입력값이 숫자 타입이 아니면 -1을 반환하여 유효하지 않은 입력을 처리합니다.
  • 입력값이 100 이하라면 가장 작은 갭풀 숫자인 100을 바로 반환합니다.
  • 그 외의 경우에는 입력값보다 하나 작은 수(prev)와 하나 큰 수(next)부터 시작해, 양방향으로 한 칸씩 범위를 넓혀가며 갭풀 숫자를 탐색합니다.
  • 양쪽 모두 갭풀 숫자가 발견되면 반복문이 종료되며, 더 가까운 쪽(작은 쪽)을 우선 반환합니다.

전체 예제 코드

const n = 134;
// 숫자 문자열을 받아 불리언 값을 반환하는 보조 함수
const isGapful = (numStr) => {
    const int = parseInt(numStr);
    return int % parseInt(numStr[0] + numStr[numStr.length - 1]) === 0;
};
// 메인 함수 -- 숫자를 받아 가장 가까운 갭풀 숫자를 반환
const nearestGapful = (num) => {
    if(typeof num !== 'number'){
        return -1;
    }
    if(num <= 100){
        return 100;
    }
    let prev = num - 1, next = num + 1;
    while(!isGapful(String(prev)) && !isGapful(String(next))){
        prev--;
        next++;
    };
    return isGapful(String(prev)) ? prev : next;
};
console.log(nearestGapful(n));

실행 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

135

134에 가장 가까운 갭풀 숫자는 135이므로, 프로그램이 올바르게 동작하는 것을 확인할 수 있습니다. 이처럼 판별 로직과 탐색 로직을 분리하면 코드의 가독성이 좋아지고, 각 함수를 독립적으로 재사용하거나 테스트하기도 훨씬 수월해집니다.