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