셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.
양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.
예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다.
생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
입력은 없다.
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993
var selfnumber = [];
function d(n) {
let number = n;
let hap = 0;
for(let i=0; i<String(n).length; i++){ //각 자리수 더해서 hap에 저장
hap += number % 10;
number = Math.floor(number / 10);
}
return n + hap;
}
//d(n)을 배열로 저장한 후, 배열에 없는 값을 출력한다.
for(let j=1 ; j<=10000; j++){
selfnumber.push(d(j));
if(!selfnumber.includes(j)){
console.log(j);
}
}
한 자리씩 나누어서 더하기 위해 일의 자리는 %10을 이용해 구하였고 number에 10으로 나눈 값을 저장해 십의 자리, 백의 자리 등을 구했다. 각 자리수를 hap에 저장하고 원래 수와 hap을 더하여 리턴하는 함수 d를 만들었다.
배열 selfnumber을 만들어 반복문을 통해 배열에 생성자를 담아주었다. 배열에 수가 없다면 문제에서 말하는 셀프넘버이므로 답을 출력한다.
includes()
메서드는 배열이 특정 요소를 포함하고 있는지 판별합니다. [1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
[1, 2, NaN].includes(NaN); // true
indexOf()
메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환하므로