BLO9
Kotlin 등 개발 관련 포스팅합니다.
Self number example

Node self number example

What is self-number

  • Eng

A self number, Colombian number or Devlali number is an integer that cannot be written as the sum of any other integer n and the individual digits of n. This property is specific to the base used to represent the integers. 20 is a self number (in base 10), because no such combination can be found (all n < 15 give a result < 20; all other n give a result > 20). 21 is not, because it can be written as 15 + 1 + 5 using n = 15. Self Number

  • Kor

    어떤 자연수 n이있을때 d(n)을 n의 각 자릿수 숫자들과 n자신을 더한 숫자라고 정의하다.
    예를 들어 d(91)=9+1+91=101 이때, n을 d(n)의 제네레이터(generator)라고 한다.
    위의 예에서 91은 101의 제네러이터이다.
    어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데,
    101의 제네레이터는 91뿐 아니라 100도 있다. 그런데 반대로,
    제네레이터가 없는 숫자를 셀프넘버(self number)라고 한다.
    
  • 소스 설명

  1. 초기화

    const MAX_VALUE = 5001; // Rage Array는 (0 ~ MAX_VALUE) - 1 이다
        
    var numberSet = new Set(Array.from(Array(MAX_VALUE).keys())); // 자바스크립트 : Rage Array만들기.
    
  2. 로직

    var _func = function (number) {
      if (number > 0 && number < MAX_VALUE) {
        var _number = (""+number).split("").map(Number).reduce(function (x, y) { return x + y}) + number // generator 구함
        numberSet.delete(_number);
        _func(_number); // array에서 delete할 경우 forEach에 검사되지 않아서 재귀해준다.
      }
    };
        
    numberSet.forEach(_func); // 돌려주면 끝 - 
    

Q. 5000까지 Self Number에 합을 구하시요.

A. 1227365

p.s 넥슨 입사문제였다고 한다. javascript기본 함수들을 몰라서 시간이 조금 소요되었다.

const MAX_VALUE = 5001; // self number max value - 1

var numberSet = new Set(Array.from(Array(MAX_VALUE).keys()));
var result = 0;
// delete self Number in set
var _func = function (number) {
  if (number > 0 && number < MAX_VALUE) {
      var _number = (""+number).split("").map(Number).reduce(function (x, y) { return x + y}) + number
      numberSet.delete(_number);
      _func(_number);
  }
};

numberSet.forEach(_func);
// Self Number sum
numberSet.forEach(function (number) {
  result += number;
});

// Result print
console.log(result);