코딩뚠뚠

[백준문제풀이] 4673 셀프 넘버 본문

알고리즘 문제풀이/백준문제풀이

[백준문제풀이] 4673 셀프 넘버

로디네로 2020. 12. 31. 01:28
반응형

 

풀이일시 : 2020-09-21

 

문제 :

셀프 넘버는 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보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.

ex)

1

3

5

.....

9982

9993

 

풀이 :

33 => 33+3+3 = 39 여기서 33이 생성자

but 이러한 생성자가 없는 숫자들도 있다.

에라토스테네스의 체 알고리즘을 조금 변경하면 풀 수 있다.

-> 특정 숫자의 생성자를 구해놓으면 그 숫자의 생성자를 언제 구하던지 항상 동일한 값이 나온다는 특징을 이용할 수 있을것이다.

 

dbstndi6316.tistory.com/53

 

[기본문제풀이] 에라토스테네스의 체

풀이 일시 : 2020-08-13 ​ 에라토스테네스의 체 : 소수(prime number) 판별 알고리즘이다. 어떤 수로도 나뉘어지지 않아야 되기 때문에 그 수를 나눠보면서 판단할 수 있다.. -> 이 방법은 O(N)의 복잡도

dbstndi6316.tistory.com

 

#include <iostream>
#define MAX 10001

using namespace std;

int a[MAX];
int d[MAX];

int getNext(int x) {
	int sum = x, temp = x, cipher = 1;
	while (temp >= 10) { //들어온 숫자의 차수를 구해주는것
		cipher++;
		temp /= 10;
	}
	for (int i = 0; i < cipher; i++) { //차수만큼 반복하면서 실행
		sum += x % 10; //x를 10으로 나눈 나머지를 더한다.
		x /= 10; //x는 x를 10으로 나눈 몫.
	}
	return sum; //계산된 숫자를 반환해준다.
}

int main() {
	for (int i = 1; i < MAX; i++) {
		for (int j = getNext(i); j < MAX; j = getNext(j)) {
			if (a[j] == 1)continue;
			else a[j] = 1; //전체경우에 대해서 생성자a[j]를 =1 처리해준다.
		}
	}
	for (int i = 1; i < MAX; i++) {
		if (a[i] == 0) //전체에 대해서 0인것만 다 뽑으면 될것이다.
			cout << i << '\n';
	}
	return 0;
}
반응형