이번 글에서는 양의 정수 n을 입력받아, 그 숫자의 자릿수들을 재배열하여 만들 수 있는 최댓값과 최솟값의 차이를 반환하는 함수 maximumDifference()를 작성해 보겠습니다.
예를 들어 숫자 n이 203이라고 가정해 보겠습니다.
- 자릿수를 내림차순으로 배열하면 만들 수 있는 최댓값은 320
- 자릿수를 오름차순으로 배열하면 만들 수 있는 최솟값은 23 (0은 맨 앞에 올 수 없으므로 일의 자리에 배치)
따라서 두 값의 차이는 다음과 같습니다.
320 - 23 = 297
즉, 이 경우 함수는 297을 반환해야 합니다.
구현 방법
핵심 아이디어는 간단합니다. 숫자를 문자열로 변환한 뒤 각 자릿수로 분리하고, 한 번은 오름차순으로, 다른 한 번은 내림차순으로 정렬한 후 다시 숫자로 변환하여 서로 빼주면 됩니다.
코드 예제
const digitDifference = num => {
const asc = +String(num).split("").sort((a, b) => {
return (+a) - (+b);
}).join("");
const des = +String(num).split("").sort((a, b) => {
return (+b) - (+a);
}).join("");
return des - asc;
};
console.log(digitDifference(203));
console.log(digitDifference(123));
console.log(digitDifference(546));
console.log(digitDifference(2354));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
297 198 198 3087
코드 설명
String(num).split(""): 숫자를 문자열로 변환한 후 개별 자릿수의 배열로 분리합니다..sort((a, b) => (+a) - (+b)): 자릿수를 오름차순으로 정렬하여 최솟값을 만듭니다..sort((a, b) => (+b) - (+a)): 자릿수를 내림차순으로 정렬하여 최댓값을 만듭니다.+String(...): 정렬된 자릿수를 다시 하나의 숫자로 변환합니다.
이처럼 정렬만으로도 손쉽게 원하는 값을 도출할 수 있으며, 시간 복잡도는 자릿수 정렬에 따라 O(d log d)(d는 자릿수)입니다.