hyunjin

[4673][c]셀프 넘버 본문

알고리즘 연습/백준

[4673][c]셀프 넘버

_h.j 2019. 3. 20. 22:44
728x90

문제

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

 

<풀이>

https://1jeemae.blog.me/221355238464

https://blog.naver.com/compa513/221434868690

 

selfnum를 체크하기 위한 배열을 만들고

1부터 쭉 selfnum을 만들고 거기서 파생될 수 있는 수들의 selfnum배열의 값을 1로 준다.

 

#makeSelfnum 함수

인자로 받은 수를 가지고 1000이하의 selfnum을 파생시켜 만들기

여기서 핵심 각 자리의 수를 어떻게 뽑아내는가?

-처음엔 for룹 안에 pow를 사용했음

-다른 사이트들을 참고해 방법 바꿈.

 

#main함수

main에서는 makeSelfnum함수에 루프를 사용해 1부터 1000까지 인자로 넘긴다. 

->루프안에서 반복 횟수가 많은 거 아닌가?

더 좋은 방법은 뭘까?

다른 사람들이 쓴 코드를 좀 살펴보니 그냥 했다. 

 

 

<코드>

 

 

//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>


int makeSelfNum(int num) {
     int div = 1, result = 0;
     while ( div <= num ) {
      result += (num / div) % 10;
      div *= 10;
     }
     return num + result;
}



int main(void)
{
     int temp;
     int arr[10100];// = (int*)calloc(10100, sizeof(int));

     for (int i = 0; i <= 10000; i++) arr[i] = i;

     for (int i = 1; i <= 10000; i++) {
      if ((temp = makeSelfNum(i)) <= 10000) arr[temp] = 0;
     }

     for (int i = 1; i <= 10000; i++)
      if (arr[i] != 0) printf("%d\n", arr[i]);


     return 0;
}
728x90

'알고리즘 연습 > 백준' 카테고리의 다른 글

[2750][c]수 정렬  (0) 2019.04.30
[5622][java]다이얼  (0) 2019.04.03
[1110]더하기 사이클  (0) 2019.03.20
[4344]평균구하기 다시!!  (0) 2019.03.20
[1546]시험 점수 조작-malloc,calloc,realloc  (0) 2019.03.19