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

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

갭풀(Gapful) 숫자란?

갭풀 숫자는 세 자리 이상의 수 가운데, 첫 번째 자릿수와 마지막 자릿수를 이어 붙여 만든 수로 나누어 떨어지는 수를 의미합니다.

조건을 만족하는 가장 작은 수는 100입니다. 첫 자리가 1, 끝자리가 0이므로 이 둘을 이어 붙이면 10이 되고, 100은 10으로 정확히 나누어 떨어지기 때문에 갭풀 숫자에 해당합니다.

문제 정의

숫자 n을 입력받아 n과 가장 가까운 갭풀 숫자(자기 자신 포함)를 반환하는 함수를 작성해야 합니다. 이때 n으로부터 거리가 같은 갭풀 숫자가 두 개 존재한다면 그중 더 작은 수를 반환해야 합니다.

몇 가지 예시는 다음과 같습니다.

gapful(25) ➞ 100

gapful(100) ➞ 100

gapful(103) ➞ 105

25처럼 세 자리 미만의 수는 갭풀 숫자가 될 수 없으므로, 그보다 큰 첫 번째 갭풀 숫자인 100이 반환됩니다. 103의 경우 첫 자리 1과 끝자리 5를 이어 붙인 15로 나누어 떨어지는 105가 가장 가까운 갭풀 숫자입니다.

해결 접근 방법

  • 입력된 수가 갭풀 숫자인지 판별하는 헬퍼 함수를 준비합니다.
  • n을 기준으로 위쪽(더 큰 수)과 아래쪽(더 작은 수) 두 방향으로 각각 탐색하여 처음 만나는 갭풀 숫자를 구합니다.
  • 두 후보 중 n에 더 가까운 값을 반환하고, 거리가 같다면 더 작은 값을 선택합니다.
  • n이 100 미만이라면 아래쪽에는 갭풀 숫자가 존재할 수 없으므로 위쪽 탐색 결과만 반환하면 충분합니다.

예제 코드

다음은 위 로직을 자바스크립트로 구현한 코드입니다.

const num = 4780;

const isGapful = n => {
   if (n < 100){
      return false;
   }
   const digits = Array.from(String(n));
   const edgeNum = Number(digits[0] + digits[digits.length - 1]);
   return n % edgeNum === 0;
}

function getClosestGapful(n) {
   let left = n, right = n;
   // 위쪽(더 큰 수) 방향으로 탐색
   while (!isGapful(right)){
      right++;
   }
   // 100 미만이면 아래쪽에 갭풀 숫자가 없으므로 바로 반환
   if (n < 100){
      return right;
   }
   // 아래쪽(더 작은 수) 방향으로 탐색
   while (!isGapful(left)){
      left--;
   }
   // 거리가 같으면 더 작은 수를 반환
   return n - left <= right - n ? left : right;
};

console.log(getClosestGapful(25));
console.log(getClosestGapful(num));

실행 결과

콘솔에는 다음과 같이 출력됩니다.

100
4760

결과 해설

4780을 예로 들어 보겠습니다. 첫 자리 4와 끝자리 0을 이어 붙인 40으로 나누어 떨어지는 수를 양방향으로 탐색하면, 아래쪽에서는 4760(거리 20), 위쪽에서는 4800(거리 20)이 가장 먼저 발견됩니다. 두 수 모두 n과의 거리가 동일하므로 문제의 규칙에 따라 더 작은 값인 4760이 최종적으로 반환됩니다.