티스토리 뷰

알고리즘/백준 문제풀이

백준 nodejs 4673번: 셀프 넘버

YG - 96년생 , 강아지 있음, 개발자 희망 2021. 8. 27. 00:43

저의 방식대로 풀었으나 for문을 너무 많이써서 시간이 오래걸리는 단점이 있어서 다른사람의 코드를 보고 배웠습니다.

 

1. 저의방식

function selfNumber(A) {
  let sum = 0;
  let allSum = 0;
  let numberArr = [];
  for (let k in A) {
    //console.log(A[k]);
    sum = sum + Number(A[k]);
  }
  allSum = Number(A) + sum;
  allSum = allSum.toString();
  //numberArr.push(+allSum);
  for (let i = 0; i < 594; i++) {
    sum = 0;
    for (let m in allSum) {
      sum = sum + Number(allSum[m]);
    }
    allSum = Number(allSum) + sum;
    allSum = allSum.toString();
    numberArr.push(+allSum);
  }
  return numberArr;
}

function removeItems(arr, value) {
  var i = 0;
  while (i < arr.length) {
    if (arr[i] === value) {
      arr.splice(i, 1);
    } else {
      ++i;
    }
  }
  return arr;
}

function solution() {
  let answer = [];
  let self;
  for (i = 1; i < 10000; i++) {
    answer.push(i);
  }
  for (j = 1; j < 9972; j++) {
    self = selfNumber(j);
    //console.dir(self, { maxArrayLength: null });
    for (k = 0; k < self.length; k++) {
      removeItems(answer, self[k]);
    }
  }
  console.dir(answer, { maxArrayLength: null });
}

solution();

먼저 셀프넘버 함수를 만들고 , 제거하는 함수도 만들고 , 그 이후에는 1~10000까지의 배열에서 셀프함수를 활용해서 배열에서 하나씩 제거하는 방식이었으나 제 에디터에서 시간이 1분 35초나 걸려서 백준사이트에서는 시간초과로 실패했습니다.

 

다른 방식이 도저히 떠오르지 않아서 

 

https://velog.io/@exploit017/%EB%B0%B1%EC%A4%80Node.js-4673%EB%B2%88

 

[백준/Node.js] 4673번: 셀프 넘버

제한 사항 출처 Contest > Waterloo's local Programming Contests > 28 September, 2002 D번 문제 대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

velog.io

 

 

이 분의 코드를 따라 배워보았습니다.

 

 

2. Min Jae Kim님의 방식

 

i.toString.length 라는 방법과 i.toSring()[j] 의 방법이 인상적이었습니다.덕분에 많이 공부가 되었던 것 같습니다.

 

let oneToMill = [];
for (let i = 1; i <= 10000; i++) {
  oneToMill.push(i);
}
//console.log(oneToMill);
let num = 1;
for (let i = 0; i <= 10000; i++) {
  let numResult = 0;
  let sumOfNumIndex = 0;

  for (let j = 0; j < i.toString().length; j++) {
    // i.toString().length == 1~10000까지 돌리는데 12345로 몇자리의 숫자인지 알려줌 . 1= 1의자리 2= 10의자리 3= 100의자리 4= 1000의자리 5=10000의자리
    //console.log(j); i가 1,2,3,4,5 일때마다 다름 . j<1 , j<2 , j<3 , j<4 , j<5
    //console.log(i.toString()[j]); // i의 숫자를 전부 표현함 . i = 959 이다  i가 3이기에 j<3 => j= 0,1,2 959[0]=9,959[1]=5,959[2]=9
    sumOfNumIndex = sumOfNumIndex + Number(i.toString()[j]);
  }
  //console.log(sumOfNumIndex); 0~10000까지 각 인덱스를 더한 값을 나타냄 1253이라면 sumofIndex[1253] = 1+2+5+3 = 11
  numResult = i + sumOfNumIndex; // i + i[j]의 합  = 생성자가 있는 숫자들
  //console.log(numResult);
  let idx = oneToMill.indexOf(numResult);
  console.log(idx); //일치하지 않는다면 -1을 출력하고 , 있다면 idx 의 값은 oneToMill 배열안의 몇번째에 위치해있는지 알려준다
  if (idx !== -1) {
    // idx가 -1이 아니라면 ==> idx가 oneToMill 배열안에 포함되어 있다면
    oneToMill.splice(idx, 1); // // splice (idx,1) idx순서에서 1가지를 제거하라
  }
}

for (let k in oneToMill) {
  // 전부 다 제거가 된 이후 oneToMill의 배열안의 내용들을 출력하라.
  console.log(oneToMill[k]);
}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함