https://www.acmicpc.net/problem/4673
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
문제
셀프 넘버는 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
-
예제 출력1
1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993
해결 방법
예전에 해결하지 못했던 문제! 답을 봐도 이해가 안 가서 보류해놨었는데 브루트 포스에서 풀려는 문제가 비슷한 문제여서 먼저 풀고 가기로 했다!
1. 인자를 생성자로 가지는 수를 찾는 함수를 만든다.
-인자를 문자열로 저장하고
-저장한 문자열의 길이만큼 반복문을 돌면서 자릿값들을 N에 다 더한다.
-그리고 인자로 받았던 수와 반복문의 결과 값을 더해서 리턴한다.
ex) 인자가 42일 때
첫 번째: i = 4, N = 4
두 번째: i=2, N= 4+ 2
최종 값 = 42 + 6 = 48
즉, 48의 생성자가 42인 것이다.
따라서 이 함수의 리턴 값은 생성자를 가지고 있는 수, 즉 셀프 넘버가 아닌 수이다.
2. 10000까지 배열을 만들어 true로 채운다.
3. 10000까지 반복문을 돌면서 2번에서 만든 배열에서 1번 값을 false로 만든다. (셀프 넘버가 아닌 수를 false로)
4. 다시 10000까지 반복문을 돌면서 2번 배열에서 true인 값만 콘솔에 찍는다.
전체 코드
function d(n){
let N=0;
let stringNumber = String(n);
for(let i=0; i<stringNumber.length; i++){
N+=Number(stringNumber[i]);
}
let Num = n + N;
return Num;
}
const range = 10000;
let selfNumbers = Array(range + 1).fill(true);
for(let i=0; i<=range; i++){
selfNumbers[d(i)] =false;
}
for(let i =0; i<range; i++){
if(selfNumbers[i]) console.log(i);
}
참고 사이트
https://laycoder.tistory.com/185
[백준] 4673번 / 셀프 넘버 / Node.js
문제 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌
laycoder.tistory.com
https://mywebproject.tistory.com/235?category=901119
❌❌백준 4673 javascript (node.js) 풀이
함수 - (2) 💡문제 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정
mywebproject.tistory.com
'알고리즘 > 백준' 카테고리의 다른 글
[JavaScript] 백준 브루트 포스 #7568번 덩치 (0) | 2022.08.30 |
---|---|
[JavaScript] 백준 브루트 포스 #2231번 분해합 (0) | 2022.08.29 |
[JavaScript] 백준 반복문 #25304번 영수증 (0) | 2022.08.26 |
[JavaScript] 백준 입출력과 사칙연산 #3003번 킹, 퀸, 룩, 비숍, 나이트, 폰 (0) | 2022.08.25 |
[JavaScript] 백준 브루트 포스 #2798번 블랙잭 (0) | 2022.08.23 |
https://www.acmicpc.net/problem/4673
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
문제
셀프 넘버는 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
-
예제 출력1
1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993
해결 방법
예전에 해결하지 못했던 문제! 답을 봐도 이해가 안 가서 보류해놨었는데 브루트 포스에서 풀려는 문제가 비슷한 문제여서 먼저 풀고 가기로 했다!
1. 인자를 생성자로 가지는 수를 찾는 함수를 만든다.
-인자를 문자열로 저장하고
-저장한 문자열의 길이만큼 반복문을 돌면서 자릿값들을 N에 다 더한다.
-그리고 인자로 받았던 수와 반복문의 결과 값을 더해서 리턴한다.
ex) 인자가 42일 때
첫 번째: i = 4, N = 4
두 번째: i=2, N= 4+ 2
최종 값 = 42 + 6 = 48
즉, 48의 생성자가 42인 것이다.
따라서 이 함수의 리턴 값은 생성자를 가지고 있는 수, 즉 셀프 넘버가 아닌 수이다.
2. 10000까지 배열을 만들어 true로 채운다.
3. 10000까지 반복문을 돌면서 2번에서 만든 배열에서 1번 값을 false로 만든다. (셀프 넘버가 아닌 수를 false로)
4. 다시 10000까지 반복문을 돌면서 2번 배열에서 true인 값만 콘솔에 찍는다.
전체 코드
function d(n){
let N=0;
let stringNumber = String(n);
for(let i=0; i<stringNumber.length; i++){
N+=Number(stringNumber[i]);
}
let Num = n + N;
return Num;
}
const range = 10000;
let selfNumbers = Array(range + 1).fill(true);
for(let i=0; i<=range; i++){
selfNumbers[d(i)] =false;
}
for(let i =0; i<range; i++){
if(selfNumbers[i]) console.log(i);
}
참고 사이트
https://laycoder.tistory.com/185
[백준] 4673번 / 셀프 넘버 / Node.js
문제 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌
laycoder.tistory.com
https://mywebproject.tistory.com/235?category=901119
❌❌백준 4673 javascript (node.js) 풀이
함수 - (2) 💡문제 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정
mywebproject.tistory.com
'알고리즘 > 백준' 카테고리의 다른 글
[JavaScript] 백준 브루트 포스 #7568번 덩치 (0) | 2022.08.30 |
---|---|
[JavaScript] 백준 브루트 포스 #2231번 분해합 (0) | 2022.08.29 |
[JavaScript] 백준 반복문 #25304번 영수증 (0) | 2022.08.26 |
[JavaScript] 백준 입출력과 사칙연산 #3003번 킹, 퀸, 룩, 비숍, 나이트, 폰 (0) | 2022.08.25 |
[JavaScript] 백준 브루트 포스 #2798번 블랙잭 (0) | 2022.08.23 |