백준 문제풀이/실버5

백준 4673번 - 셀프 넘버

void_melody 2021. 11. 23. 22:20

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

사고과정)

우선 d(n)을 만드는 과정의 함수를 구현해야한다.

이건 n + n의 각 자리를 더하면 되니 간단함.

문제는 해당 조건에 맞는 셀프넘버를 출력시킬 것인가이다.

생각했던 방법은, d(n)을 n이 1부터 쭉 반복한다. 그러면서 d(n)이 10000이하까지일때까지 반복하면서

해당 d(n)의 값과 대응하는 인덱스의 배열에 값이 있다는 뜻의 '1'을 넣어놓는다.

이러면 배열 안에서 d(n)에 해당하는 인덱스가 비어있다면 없는 것이니 없는 인덱스에 한해서만 출력시키면 된다.

#include <iostream>
using namespace std;

int d(int n)
{
	int sum = n;
	while (n != 0)
	{
		sum = sum + n % 10;
		n = n / 10;
	}
	return sum;
}
int main()
{
	std::cin.tie(NULL);
	std::ios::sync_with_stdio(false);

	int arr[10001] = { 0, };
	for (int i = 1; i <= 10000; i++)
	{
		if (d(i) <= 10000)
		{
			arr[d(i)] = 1;
		}
	}
	
	for (int i = 1; i <= 10000; i++)
	{
		if (arr[i] != 1)
			cout << i << '\n';
	}
	return 0;
}