이번 글에서는 숫자 배열을 입력받아 각 숫자의 자릿수(digit)를 특정 순서, 여기서는 오름차순으로 재배열하는 JavaScript 함수를 작성해 보겠습니다.
문제 이해하기
예를 들어 다음과 같은 배열이 있다고 가정해 보겠습니다.
const arr = [543, 65, 343, 75, 567, 878, 87];
각 숫자의 자릿수를 오름차순으로 정렬하면 출력 결과는 다음과 같아야 합니다.
const output = [345, 56, 334, 57, 567, 788, 78];
해결 접근 방식
핵심 로직은 다음과 같습니다.
1. 숫자를 문자열로 변환한 뒤 한 글자씩 분리합니다.
2. 분리된 자릿수를 오름차순으로 정렬합니다.
3. 정렬된 자릿수를 다시 하나의 값으로 합쳐 반환합니다.
4. 배열의 모든 요소에 대해 위 과정을 반복합니다.
구현 코드
위 로직을 코드로 구현하면 다음과 같습니다.
const arr = [543, 65, 343, 75, 567, 878, 87];
// 개별 숫자의 자릿수를 오름차순으로 정렬하는 함수
const ascendNumber = num => {
const numArr = String(num).split('').map(el => +el);
numArr.sort((a, b) => a - b);
return numArr.join('');
};
// 배열 전체에 적용하는 함수
const sortDigits = arr => {
const res = [];
for(let i = 0; i < arr.length; i++){
res.push(ascendNumber(arr[i]));
};
return res;
};
console.log(sortDigits(arr));코드 설명
ascendNumber 함수는 먼저 String(num).split('')을 통해 숫자를 자릿수 배열로 만들고, map(el => +el)로 각 요소를 숫자형으로 변환합니다. 이후 sort((a, b) => a - b)를 사용해 오름차순으로 정렬한 뒤, join('')으로 다시 하나의 값으로 합칩니다.
sortDigits 함수는 반복문을 통해 원본 배열의 각 요소에 ascendNumber를 적용하고 그 결과를 새로운 배열에 담아 반환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ '345', '56', '334', '57', '567', '788', '78' ]
출력값이 문자열로 표시되는데, 이는 join('')이 문자열을 반환하기 때문입니다. 만약 숫자 타입이 필요하다면 반환 시 Number()로 감싸주면 됩니다.