이번 글에서는 숫자를 인수로 받아, 원래 숫자의 모든 자릿수를 각각 제곱한 뒤 이어 붙여 새로운 숫자를 반환하는 JavaScript 함수를 작성해 보겠습니다.
문제 이해하기
예를 들어 숫자가 99라면 출력 결과는 다음과 같아야 합니다.
8181
그 이유는 9의 제곱이 81이기 때문입니다. 두 개의 자릿수 '9'가 각각 제곱되어(81, 81) 문자열처럼 연결되면 8181이 됩니다.
마찬가지로 숫자가 9119라면, 9→81, 1→1, 1→1, 9→81 순서로 계산되어 최종 결과는 811181이 됩니다.
구현 코드
이 함수는 다음과 같이 작성할 수 있습니다.
const num = 9119;
const squared = num => {
// 숫자를 문자열로 변환해 각 자릿수에 접근
const numStr = String(num);
let res = '';
for (let i = 0; i < numStr.length; i++) {
// 각 자릿수를 숫자로 변환한 뒤 제곱
const square = Math.pow(+numStr[i], 2);
// 제곱한 값을 결과 문자열에 연결
res += square;
}
return res;
};
console.log(squared(num));
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
811181
코드 동작 원리
이 함수의 핵심 로직을 단계별로 정리하면 다음과 같습니다.
- String(num): 숫자를 문자열로 변환하면 배열처럼 인덱스를 사용해 각 자릿수에 접근할 수 있습니다.
- +numStr[i]: 단항 더하기(+) 연산자로 해당 자릿수를 다시 숫자 타입으로 변환합니다.
- Math.pow(+numStr[i], 2): 변환된 숫자의 제곱을 계산합니다. ES2016 이상 환경이라면 지수 연산자(**)를 써서 numStr[i] ** 2로 표현할 수도 있습니다.
- res += square: 제곱한 값들을 문자열 형태로 이어 붙여 최종 결과를 만듭니다.
대체 구현: map 활용하기
for 루프 대신 map 메서드를 사용하면 같은 로직을 더 간결하게 표현할 수 있습니다.
const squared = num =>
String(num)
.split('')
.map(digit => digit ** 2)
.join('');
console.log(squared(9119)); // 811181
이 방식은 문자열을 개별 자릿수 배열로 분리한 뒤, 각 요소를 제곱하고 다시 하나의 문자열로 합치는 선언적인 흐름을 따르므로 가독성이 뛰어납니다.