문제 소개
이번 글에서는 하나의 숫자를 입력받아, 각 자릿수의 값을 명확히 보여주는 확장된 형태(expanded form)의 문자열을 반환하는 JavaScript 함수를 작성해 보겠습니다.
예를 들어 숫자 56577이 입력되면, 이를 만 단위부터 일의 자리까지 분해하여 다음과 같은 결과를 얻어야 합니다.
50000 + 6000 + 500 + 70 + 7
풀이 코드
다음은 위 문제를 해결하는 전체 코드입니다.
const num = 56577;
const expandedForm = (num = 0) => {
const str = String(num);
let res = '';
let multiplier = Math.pow(10, str.length - 1);
for(let i = 0; i < str.length; i++){
const el = +str[i];
const next = +str[i + 1];
if(el){
res += (el * multiplier);
};
if(next){
res += ' + ';
};
multiplier /= 10;
};
return res;
};
console.log(expandedForm(num));코드 동작 원리
코드가 어떤 방식으로 동작하는지 단계별로 살펴보겠습니다.
1. 숫자를 문자열로 변환
String(num)을 사용해 숫자를 문자열로 바꾸면, 각 자릿수에 인덱스로 접근할 수 있어 처리가 훨씬 간편해집니다.
2. 곱수(multiplier) 초기화
Math.pow(10, str.length - 1)로 가장 높은 자릿값(예: 5자리 숫자라면 10000)을 구합니다. 이 값은 반복문 안에서 매번 10으로 나누어 일의 자리까지 차례대로 줄어듭니다.
3. 각 자릿수 계산 및 연결
반복문 내부에서는 현재 자릿수 el과 그 다음 자릿수 next를 확인합니다. 현재 자릿수가 0이 아니라면 해당 자릿값(el * multiplier)을 결과 문자열에 추가하고, 다음 자릿수도 존재한다면 덧셈 기호 ' + '를 붙여 연결합니다. 덕분에 마지막 자릿수 뒤에는 불필요한 '+' 기호가 붙지 않습니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.
50000 + 6000 + 500 + 70 + 7
이처럼 문자열 변환과 자릿값 곱셈만으로도 복잡한 수학적 처리 없이 손쉽게 숫자를 확장 형태로 표현할 수 있습니다. 참고로 이 알고리즘은 시간 복잡도 O(n)(n은 자릿수)으로 매우 효율적이며, 중간에 0이 포함된 숫자(예: 50607)도 올바르게 처리됩니다.