알고리즘/백준 문제풀이
백준 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]);
}