ALGORITHM/BOJ (Node.js)

βŒβŒλ°±μ€€ 4673 javascript (node.js) 풀이

thisisyjin 2022. 1. 10. 14:22

ν•¨μˆ˜ - (2)

 

 


 

πŸ’‘λ¬Έμ œ

μ…€ν”„ λ„˜λ²„λŠ” 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

 


 

< μ½”λ“œ >

 

 

<문제 이해>

 

μžλ¦¬μˆ˜μ— 따라 d(n)을 ꡬ할 수 μžˆλ‹€. 

d(n)을 κ΅¬ν•˜κ³  λ°°μ—΄λ‘œ μ €μž₯ν•œ 후에 (μž„μ˜μ˜ 배열에 d(n)값을 pushν•œλ‹€.)

i=1λΆ€ν„° 10000κΉŒμ§€ d(n)에 μ—†λ‹€λ©΄ 좜λ ₯ν•˜λ©΄ λœλ‹€.

(즉, λ§Œμ•½ i=42이고 d(n)값이 μ €μž₯λ˜μ–΄μžˆλŠ” 배열에 42κ°€ μ—†μœΌλ―€λ‘œ 좜λ ₯ = λ§€μ§λ„˜λ²„)

 

 

 

** 배열에 ν•΄λ‹Ή μΈμžκ°€ μ—†λ‹€λŠ” 것은 μ–΄λ–»κ²Œ κ΅¬ν• κΉŒ?

 

방법 1/ if(arr.includes(i))

방법 2/ if(arr.indexof(i) === -1)

 

 

 

** d(n)의 계산. 

n이 ν•œμžλ¦¬μˆ˜λ©΄? d(n) = n+n = 2n

n이 λ‘μžλ¦¬μˆ˜λ©΄? d(n) = n+μ‹­+일

n이 μ„Έμžλ¦¬μˆ˜λ©΄? d(n) = n+λ°±+μ‹­+일

n이 λ„€μžλ¦¬μˆ˜λ©΄? d(n) = n+천+λ°±+μ‹­+일

n이 λ‹€μ„―μžλ¦¬μˆ˜(=10000)λ©΄? d(n) = 10000+1 = 10001

 

 

 

** 자리 계산은 μ–΄λ–»κ²Œ ν• λž˜?

 

<방법1> 숫자 크기둜 λ‚˜λˆ”

0<n<10

10<=n<100

100<=n<1000

1000<=n<10000

n=10000

 

d(n)을 κ΅¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ„œ array에 pushν•˜κ³ ,

for문으둜 includes(i)둜 μ…€ν”„λ„˜λ²„λ₯Ό 찾음.

 

function selfNumber(){
   let Dn;
   let array = [];
   for(let n = 0; n < 10000; n++){
       if(0 < n && n < 10){ // n 이 ν•œμžλ¦¬ 일 λ•Œ
           Dn = 2*n;
       }else if(10 <= n && n < 100){ // n이 λ‘μžλ¦¬μΌ λ•Œ
           Dn =  n + (Math.floor(n / 10)) + (n % 10);
       }else if(100 <= n && n < 1000){ // n이 μ„Έμžλ¦¬ 일 λ•Œ
           Dn = n + (Math.floor(n / 100)) + (Math.floor((n % 100) / 10)) + (n % 10);
       }else if(1000 <= n && n < 10000){ // n이 λ„€μžλ¦¬μΌ λ•Œ
           Dn = n + (Math.floor(n / 1000)) + (Math.floor((n % 1000) / 100)) + (Math.floor((n % 100) / 10) ) + (n % 10);
       }else{ // n = 10000
           Dn = 10001;
       }
       array.push(Dn);
   }
   for(let i = 1; i <= 10000; i++){
       if(!array.includes(i)){
           console.log(i);
       }
   }
}
selfNumber();

 

 

 

+) λ‹€λ₯Έ 방법이 μžˆμ„κΉŒ μ‹Άμ–΄ 좔가함

 

<방법2> ** https://velog.io/@dragoochoλ‹˜μ˜ ν¬μŠ€νŒ…μ„ μ°Έμ‘°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

let arr = [];
let answer = [];

for (let i = 1; i <= 10000; i++) {
  let N = 0;
  let stringNumber = String(i);
  for (let j = 0; j < stringNumber.length; j++) {
    N += Number(stringNumber[j]);
  }
  let nNum = i + N;
  arr.push(nNum);
}

for (let i = 1; i <= 10000; i++) {
  if (arr.indexOf(i) === -1) {
    answer += i + "\n";
  }
}

console.log(answer);

N을 각 자리의 수둜 ν•˜μ—¬

N에 string(i)λ₯Ό ν•œ ν›„ string의 j번째 자리λ₯Ό λˆ„μ ν•˜μ—¬ 더함.

d(n)값은 κ·Έ 수+각자리수의 ν•©μ΄λ―€λ‘œ i+N을 ν•œ ν›„ d(n)값을 arr에 push함.