티스토리 뷰
저의 방식대로 풀었으나 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
이 분의 코드를 따라 배워보았습니다.
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]);
}
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
백준 nodejs 11654번: 아스키 넘버 (0) | 2021.08.27 |
---|---|
백준 nodejs 1065번: 한수 (0) | 2021.08.27 |
백준 nodejs 4344번: 평균은 넘겠지 (0) | 2021.08.26 |
백준 nodejs 8958번: OX퀴즈 (0) | 2021.08.25 |
백준 nodejs 1546번: 평균 (0) | 2021.08.25 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- CLASS
- error
- 프리온보딩
- 아차산
- 윤성우 열혈C프로그래밍
- 노개북
- env
- createPortal
- nodejs
- 초보
- 북클럽
- jest
- 원티드
- nextjs
- javascript
- 위코드
- NextRequest
- WSL2
- React
- import/order
- TopLayer
- 노마드코더
- NextApiRequest
- Storybook
- 우아한테크코스
- C언어
- 스토리 북
- 프론트앤드
- electron
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함