백준 4673 셀프넘버

Develop My Life·2022년 2월 14일
0

PS

목록 보기
4/32
post-thumbnail

문제

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

풀이

#include <iostream>

using namespace std;

int a[10001] = { 0 };

int d(int n) {
	int ans = n;
	while (n > 0) {
		int tmp = n % 10;
		ans += tmp;
		n /= 10;
	}
	return ans;
}

int main()
{
	
	for (int i = 1; i < 10000; i++) {
		if (a[i] == 0) {
			int next = d(i);
			while(next < 10000) { //10000보다 작은 수까지
				if (a[next] == 0) { // 없는 수인 경우
					a[next] = 1;
					next = d(next);
					//cout << next << endl;
				}
				else { //이미 있다면 멈춤
					break;
				}
			}
		}
	}
	
	for (int i = 1; i < 10000; i++) {
		if (a[i] != 1) {
			cout << i << endl;
		}
	}

	return 0;
}

d 함수를 만드는데 이는 입력이 들어왔을 때 다음 수를 출력해주는 함수이다. 처음에 인덱스 1부터 10000에 해당하는 공간에 0으로 초기화하고 셀프 넘버가 아니면 값을 1로 바꾸어 표시하는 것이다. while문을 이용하여 다음 수가 10000보다 작은 동안 계속 반복하며 1로 바꾸고 만약 이미 1이라면 이미 다음은 모두 표시되어 있으므로 break를 한다. 그리고 마지막에 여전히 0으로 되어 있는 숫자를 모두 출력한다.

0개의 댓글