티스토리 뷰

알고리즘(C++)/백준 알고리즘

4673번 : 셀프 넘버

개발하는꼬물이 2018. 4. 17. 17:42

1. 문제 요약

   양의 정수 n에 대해 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어 d(75) = 75 + 7 + 5 = 87이다.

   n을 d(n)의 생성자라고 한다. 예를 들어 33은 39의 생성자이다. (d(33) = 33 + 3 + 3 = 39)

   이러한 생성자가 없는 숫자를 셀프 넘버라고 하는데, 10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 

   프로그램을 작성하시오.


2. 예제 입력



3. 예제 출력

1
3
5
7
9
20

...

9971
9982
9993


4. 코드 

#include <iostream>
using namespace std;

int d(int currentNum)  // 자릿수 구하기 
{
	int numArr[5] = { 0 };

	numArr[0] = currentNum / 10000;
	numArr[1] = (currentNum % 10000) / 1000;
	numArr[2] = (currentNum  % 1000) / 100;
	numArr[3] = (currentNum % 100) / 10;
	numArr[4] = (currentNum % 10);

	int result = currentNum + numArr[0] + numArr[1] + numArr[2] + numArr[3] + numArr[4];
	
	return result;
}

int main()
{
	bool isSelfNum[10001] = { 0 }; 
	int n = 1;

	while (1)
	{
		int t = d(n);

		if (n >= 10000)
			break;

		if (t <= 10000)
			isSelfNum[t] = 1;

		n++;
	}

	for(int i = 1; i < 10000; i++)
	{
		if (isSelfNum[i] == 0)
		{
			cout << i << endl;
		}
	}
	
	return 0;
}

-> d(n)이 만들어내는 결과 값을 갖는 index를 1로 변경하면, d(n)이 만들어내지 않는 수만 출력이 가능하다.

    즉, 생성자가 없는 수의 isSelfNum 배열 값은 0을 유지하게 되므로, index의 값이 0인 index를 출력하면 

    셀프넘버를 구할 수 있음!


    ex) n = 1 이면 d(1) = t = 2, isSelfNum[2] = 1

         n = 2 이면 d(2) = t = 4, isSelfNum[4] = 1

         n = 3 이면 d(3) = t = 6, isSelfNum[6] = 1   ... 이므로, 


         1~ 10000 중에 d(n)에 의해 만들어지지 않는 수(1, 3, 7,...) 만 출력이 가능!

'알고리즘(C++) > 백준 알고리즘' 카테고리의 다른 글

11654번 : 아스키코드  (0) 2018.05.03
1065번 : 한수  (0) 2018.05.03
15552번 : 빠른 A+B  (2) 2018.04.17
1110번 : 더하기 사이클  (0) 2017.11.19
1546번 : 평균  (0) 2017.11.19
댓글