암스트롱 수(Armstrong Number)란, 양의 정수의 각 자릿수를 자릿수의 개수(n)만큼 거듭제곱한 값들을 모두 더했을 때 그 합이 원래 수와 같아지는 수를 말합니다.
abcd... = a^n + b^n + c^n + d^n + ...
예를 들어 153은 세 자리 수이며, 1³ + 5³ + 3³ = 1 + 125 + 27 = 153이므로 암스트롱 수에 해당합니다.
문제 정의
정확히 두 개의 숫자를 요소로 가지는 배열, 즉 범위를 나타내는 배열을 입력받는 JavaScript 함수를 작성해야 합니다. 이 함수는 해당 범위 안에 속한 모든 암스트롱 수를 배열 형태로 반환해야 하며, 시작 숫자와 끝 숫자 역시 암스트롱 수라면 결과에 포함되어야 합니다.
접근 방식
먼저 주어진 숫자가 암스트롱 수인지 판별하는 함수를 별도로 작성합니다. 이후 범위의 시작 값부터 끝 값까지 반복문을 돌면서 각 숫자를 판별 함수로 검사하고, 암스트롱 수인 경우에만 결과 배열에 추가하는 방식으로 문제를 해결할 수 있습니다.
예제 코드
다음은 전체 구현 코드입니다.
const range = [11, 1111];
const isArmstrong = (num) => {
const numberOfDigits = ('' + num).length;
let sum = 0;
let temp = num;
while (temp > 0) {
let remainder = temp % 10;
sum += remainder ** numberOfDigits;
temp = parseInt(temp / 10);
}
return sum === num;
};
const findAllArmstrong = ([start, end]) => {
const res = [];
for(let i = start; i <= end; i++){
if(isArmstrong(i)){
res.push(i);
};
};
return res;
};
console.log(findAllArmstrong(range));코드 설명
isArmstrong 함수: 숫자를 문자열로 변환해 자릿수 개수를 구한 뒤, while 반복문에서 10으로 나눈 나머지를 이용해 일의 자리 숫자를 하나씩 추출합니다. 추출한 숫자를 자릿수 개수만큼 거듭제곱하여 합계에 더하고, 모든 자릿수를 처리한 후 합계가 원래 숫자와 같은지 비교해 참 또는 거짓을 반환합니다.
findAllArmstrong 함수: 구조 분해 할당으로 시작 값과 끝 값을 꺼낸 후, for 반복문으로 범위 내 모든 숫자를 검사하고 암스트롱 수로 판별된 숫자만 결과 배열에 push합니다.
출력 결과
콘솔에는 다음과 같은 결과가 출력됩니다.
[ 153, 370, 371, 407 ]
범위 [11, 1111] 내에서 발견된 암스트롱 수는 총 네 개이며, 각각 다음과 같이 검증됩니다.
- 153 = 1³ + 5³ + 3³
- 370 = 3³ + 7³ + 0³
- 371 = 3³ + 7³ + 1³
- 407 = 4³ + 0³ + 7³