암스트롱 수란 무엇인가?
암스트롱 수(Armstrong Number)는 각 자릿수를 '자릿수의 개수'만큼 거듭제곱한 값들을 모두 더했을 때, 그 합이 원래 수와 같아지는 수를 말합니다. 수식으로 표현하면 다음과 같습니다.
xy…z = xn + yn + … + zn (n은 해당 숫자의 자릿수)
예시
153은 세 자리 수이며, 아래 조건을 만족하기 때문에 암스트롱 수입니다.
1³ + 5³ + 3³ = 1 + 125 + 27 = 153
문제 요구사항
두 개의 숫자, 즉 범위의 시작값과 끝값을 입력받아 그 사이에 존재하는 모든 암스트롱 수를 배열로 반환하는 JavaScript 함수를 작성해야 합니다. 이때 시작값과 끝값 자체가 암스트롱 수라면 결과에 반드시 포함되어야 합니다.
구현 코드
먼저 임의의 숫자가 암스트롱 수인지 판별하는 isArmstrong 함수를 정의하고, 이를 활용해 지정된 범위를 순회하는 armstrongBetween 함수를 작성합니다.
const isArmstrong = number => {
let num = number;
const len = String(num).split("").length;
let res = 0;
while(num){
const last = num % 10;
res += Math.pow(last, len);
num = Math.floor(num / 10);
};
return res === number;
};
const armstrongBetween = (lower, upper) => {
const res = [];
for(let i = lower; i <= upper; i++){
if(isArmstrong(i)){
res.push(i);
};
};
return res;
};
console.log(armstrongBetween(1, 400));코드 동작 원리
- 자릿수 계산:
String(num).split("").length를 사용해 숫자를 문자열로 변환한 뒤 자릿수(n)를 구합니다. - 마지막 자릿수 추출:
num % 10연산으로 가장 뒤에 있는 자릿수를 가져옵니다. - 거듭제곱 합산:
Math.pow(last, len)로 해당 자릿수를 n제곱한 값을 누적 합계에 더합니다. - 자릿수 제거:
Math.floor(num / 10)로 처리가 끝난 마지막 자릿수를 잘라내고, 숫자가 0이 될 때까지 반복합니다. - 판별: 누적합이 원래 숫자와 일치하면
true를 반환하여 암스트롱 수임을 확인합니다.
armstrongBetween 함수는 lower부터 upper까지의 모든 정수를 순회하며 isArmstrong 검사를 통과한 값만 결과 배열에 담아 반환합니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
[
1, 2, 3, 4, 5,
6, 7, 8, 9, 153,
370, 371
]1부터 400 사이에는 한 자리 수인 1~9 전체와, 세 자리 암스트롱 수인 153, 370, 371이 존재합니다. 참고로 370 = 3³ + 7³ + 0³, 371 = 3³ + 7³ + 1³이므로 두 수 역시 암스트롱 수의 조건을 충족합니다.