[백준] JavaScript 4673번 셀프 넘버

Noma·2021년 9월 4일
0
post-custom-banner

Question

[백준] JavaScript 4673번 셀프 넘버

input

없음

output

10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.

example

1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993

Solution 1

각 자리수를 나눗셈과 나머지 연산을 통해 구한다.

false가 10000개인 배열을 만들고, for문을 돌면서 숫자와 각 자리수의 합(d(n))과 같은 번째인 배열 요소(arr[d(i)-1])를 true로 만들어 준다. 이 과정으로 셀프넘버인지 아닌지로 이루어진 배열이 만들어지면, 다시 for문을 돌면서 값이 false인 요소(셀프넘버)만 출력해준다.

function d(n){
    let sum=n;
    let temp=sum;
    while(temp>0){
        sum+=temp%10;
        temp=parseInt(temp/10);
    }
    return sum;
}
const N=10000;
const arr=new Array(N).fill(false);
for(let i=1;i<=N;i++){
    arr[d(i)-1]=true;
}
for(let i=0;i<N;i++){
    !arr[i]&&console.log(i+1);
}

Solution 2

각 자리수를 문자열 split('') 방법으로 만들고 reduce로 합을 구한다.
빈 배열을 만들고 거기에 결과값을 넣어 join('\n')으로 한번에 출력.

let temp = [];
let result = [];
for(let i = 1; i <= 10000; i++) {
  temp.push(i + i.toString().split('').reduce((prev, curr)=> prev + parseInt(curr), 0));
}
for(let i = 1; i <= 10000; i++) {
  if(temp.indexOf(i) === -1){
      result.push(i);
  }
}
console.log(result.join('\n'));

What I learned

1. 자리수가 정해져 있지 않고 각 자리수를 더하고 싶을 때

총합(sum)과 임시 값(temp)을 넣을 변수를 만들고 while로 temp의 일의 자리를 구하고 이를 sum에 더해준 후 temp을 parseInt(temp/10)으로 일의 자리를 빼준다. (ex. 4321=>432) 이런식으로 temp가 일의 자리일 때까지 반복해준다. (ex. temp: 4321=>432=>43=>4)

2. 어떤 값이 N개 채워진 배열 만드는 방법

  • new Array(N).fill(어떤 값)

    • new Array(N) : undefined가 N개인 배열을 생성함
    • arr.fill(value[, start[, end]]) : 배열의 특정 구간을 특정 값으로 채움
  • Array.from({length:N},()=>어떤 값)

3. arr.indexOf(searchElement[, fromIndex])

indexOf() 메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환한다.


Reference

https://dpsc615.tistory.com/40
https://www.acmicpc.net/source/2856026

profile
오히려 좋아
post-custom-banner

0개의 댓글