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

JavaScript에서 같은 자릿수로 만든 바로 다음 큰 수 찾기

문제 개요

숫자 n을 입력받아, 같은 자릿수를 그대로 사용하면서 입력값보다 큰 수 중 가장 작은 수, 즉 '바로 다음으로 큰 수'를 반환하는 JavaScript 함수를 작성해야 합니다.

예를 들어 입력 숫자가 112라면, 숫자 1, 1, 2를 재배열해 만들 수 있는 수 중 112보다 크면서 가장 작은 수는 121입니다. 따라서 출력 결과는 121이 되어야 합니다.

해결 아이디어

이 문제의 핵심은 '같은 숫자로 만들 수 있는 최댓값'을 기준으로 삼는 것입니다. 접근 방식은 다음과 같습니다.

  • 입력 숫자의 자릿수를 내림차순으로 정렬하면, 같은 숫자들로 만들 수 있는 가장 큰 수를 구할 수 있습니다.
  • 입력값 + 1부터 이 최댓값까지 숫자를 하나씩 증가시키며, 각 숫자의 자릿수를 정렬했을 때 원래 숫자와 일치하는지 확인합니다.
  • 일치하는 첫 번째 숫자가 곧 '바로 다음으로 큰 수'입니다.
  • 최댓값까지 확인해도 찾지 못한다면 -1을 반환합니다.

구현 코드

다음은 위 로직을 구현한 코드입니다.

const num = 112;
const findNextBigger = (num = 1) => {
    const sortedDigits = (num = 1) => {
        return String(num)
        .split('')
        .sort((a, b) => b - a);
    };
    let max = sortedDigits(num).join('');
    max = Number(max);
    for(let i = num + 1; i <= max; i++){
        if(max === +sortedDigits(i).join('')){
            return i;
        };
    };
    return -1;
};
console.log(findNextBigger(num));

코드 동작 원리

sortedDigits 헬퍼 함수는 숫자를 문자열로 변환한 뒤 각 자릿수로 분리하고, 내림차순으로 정렬합니다. 이 정렬된 배열을 문자열로 합치면 해당 숫자 조합의 최댓값이 됩니다. 이후 반복문을 통해 입력값보다 큰 수들을 차례대로 검사하며, 자릿수를 정렬한 결과가 최댓값과 동일한 첫 번째 수를 찾으면 즉시 반환합니다.

출력 결과

121

참고 사항

이 방법은 직관적이고 구현이 간단하지만, 자릿수가 많은 숫자의 경우 탐색 범위가 넓어져 반복 횟수가 많아질 수 있습니다. 따라서 작은 규모의 입력에는 적합하지만, 성능이 중요한 환경에서는 자릿수를 직접 비교·교환하는 방식으로 최적화하는 것이 좋습니다.