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

JavaScript로 자연수의 n번째 자릿수 찾기


문제 이해하기

수학에서 자연수는 1부터 시작하여 무한히 이어지는 수를 의미합니다. 처음 15개의 자연수는 다음과 같습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

이 수열을 자릿수 단위로 읽으면, 첫 번째 자릿수는 1, 두 번째는 2, 세 번째는 3처럼 이어집니다. 그런데 9를 지나면 상황이 달라집니다. 열 번째 자릿수는 10의 첫 자리인 1이 되고, 열한 번째 자릿수는 그다음 자리인 0입니다.

즉, 이 문제는 자연수를 한 줄로 이어 붙여 만든 무한한 숫자 문자열에서 n번째 위치에 있는 숫자 하나를 찾는 것입니다.

JavaScript 구현

숫자 n을 입력받아 n번째 자연수 자릿수를 찾아 반환하는 함수를 작성해 보겠습니다.

const findNthDigit = (num = 1) => {
   let start = 1;
   let len = 1;
   let count = 9;
   while(num > len * count) {
      num -= len * count;
      len++; count *= 10;
      start *= 10;
   };
   start += Math.floor((num-1)/len);
   let s = String(start);
   return Number(s[(num-1) % len]);
};
console.log(findNthDigit(5));
console.log(findNthDigit(15));
console.log(findNthDigit(11));
console.log(findNthDigit(67));

코드 동작 원리

이 알고리즘은 자릿수 길이별로 숫자들을 구간으로 나누어 접근합니다.

  • start: 현재 구간의 첫 번째 숫자 (1 → 10 → 100 → ...)
  • len: 현재 구간 숫자의 자릿수 (1자리 → 2자리 → 3자리 → ...)
  • count: 현재 구간에 속한 숫자의 개수 (9개 → 90개 → 900개 → ...)

while 루프는 n이 현재 구간의 전체 자릿수(len × count)보다 클 때 반복됩니다. 조건을 만족하면 해당 구간이 차지하는 자릿수만큼 n에서 차감하고, 자릿수·개수·시작값을 다음 구간 기준으로 갱신합니다. 루프가 끝나면 n은 목표 자릿수가 속한 구간 내에서의 상대적 위치를 나타냅니다.

이후 Math.floor((num-1)/len)으로 n번째 자릿수를 포함하는 실제 숫자를 구하고, 그 숫자를 문자열로 변환한 뒤 (num-1) % len 인덱스로 정확한 자릿수 하나를 추출해 반환합니다.

실행 결과

콘솔 출력 결과는 다음과 같습니다.

5
2
0
8

결과 검증

호출반환값설명
findNthDigit(5)5수열 "123456789…"의 5번째 자릿수
findNthDigit(15)2"…1112"에서 12의 마지막 자리
findNthDigit(11)010의 두 번째 자리
findNthDigit(67)838의 두 번째 자리

이 방식은 1자리, 2자리, 3자리 숫자 구간을 단계적으로 건너뛰며 계산하므로, n이 매우 커져도 효율적으로 답을 구할 수 있습니다.