숫자의 가중치란 무엇인가?
숫자의 가중치(weight)란 해당 숫자를 구성하는 모든 자릿수의 합을 의미합니다. 몇 가지 예시로 쉽게 이해할 수 있습니다.
100의 가중치 → 1 + 0 + 0 = 1
22의 가중치 → 2 + 2 = 4
99의 가중치 → 9 + 9 = 18
123의 가중치 → 1 + 2 + 3 = 6
문제 요구사항
숫자로 이루어진 배열을 입력받아 다음 규칙에 따라 정렬하는 자바스크립트 함수를 작성해 보겠습니다.
- 모든 숫자를 가중치 기준 오름차순으로 정렬한다.
- 가중치가 서로 같은 숫자가 있다면, 실제 값 기준 오름차순으로 배치한다.
예를 들어 50과 23은 가중치가 모두 5로 동일합니다. 이 경우 실제 값이 더 작은 23을 50보다 앞에 위치시켜야 합니다.
해결 접근 방식
이 문제는 두 개의 함수로 깔끔하게 분리해서 풀 수 있습니다.
- 가중치 계산 함수(calculateWeight) — 재귀 호출을 통해 숫자의 각 자릿수를 하나씩 더합니다.
- 정렬 비교 함수(sorter) —
Array.prototype.sort()에 전달할 비교 로직을 담당합니다.
여기서 핵심은 비교 함수 안의 논리 OR(||) 연산자입니다. 가중치 차이가 0이면 falsy한 값이 되어 뒤의 a - b가 평가되므로, "가중치 우선, 값 차선"이라는 두 단계 정렬 규칙을 단 한 줄의 표현식으로 처리할 수 있습니다.
구현 코드
const arr = [2, 1, 100, 56, 78, 3, 66, 99, 200, 46];
// 자릿수의 합(가중치)을 재귀적으로 계산하는 함수
const calculateWeight = (num, sum = 0) => {
if (num) {
return calculateWeight(Math.floor(num / 10), sum + (num % 10));
}
return sum;
};
// 가중치가 같으면 실제 값으로 비교하는 정렬 함수
const sorter = (a, b) => {
return calculateWeight(a) - calculateWeight(b) || a - b;
};
arr.sort(sorter);
console.log(arr);
코드 상세 설명
calculateWeight:num % 10으로 마지막 자릿수를 꺼내 누적합(sum)에 더하고,Math.floor(num / 10)으로 일의 자리를 제거한 뒤 자기 자신을 다시 호출합니다. num이 0이 되면 지금까지 누적된 합을 반환하며 재귀가 종료됩니다.sorter: 먼저 두 숫자의 가중치 차이를 계산합니다. 결과가 0이 아니면 그대로 반환되고, 0이면 OR 연산자에 의해a - b가 평가되어 실제 값 순으로 정렬됩니다.
실행 결과
위 코드를 실행하면 콘솔에 아래와 같은 결과가 출력됩니다.
[
1, 100, 2, 200, 3,
46, 56, 66, 78, 99
]
결과 검증
정렬된 배열의 각 숫자별 가중치를 확인해 보면 규칙이 올바르게 적용되었음을 알 수 있습니다.
| 숫자 | 가중치 계산 | 가중치 |
|---|---|---|
| 1 | 1 | 1 |
| 100 | 1 + 0 + 0 | 1 |
| 2 | 2 | 2 |
| 200 | 2 + 0 + 0 | 2 |
| 3 | 3 | 3 |
| 46 | 4 + 6 | 10 |
| 56 | 5 + 6 | 11 |
| 66 | 6 + 6 | 12 |
| 78 | 7 + 8 | 15 |
| 99 | 9 + 9 | 18 |
가중치가 1 → 2 → 3 → … → 18 순으로 단조 증가하며, 같은 가중치를 가진 숫자들(1과 100, 2와 200)은 실제 값이 작은 것이 앞에 배치된 것을 확인할 수 있습니다.
마무리
이처럼 자바스크립트의 sort() 메서드에 커스텀 비교 함수를 조합하면, 단순 값 정렬을 넘어 파생 기준(여기서는 자릿수 합)에 따른 다단계 정렬도 손쉽게 구현할 수 있습니다. 문자열의 문자 코드 합계 기반 정렬, 객체 배열의 여러 속성 조합 정렬 등에도 동일한 패턴을 응용할 수 있으니 꼭 기억해 두세요.