백준 문제풀이

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

찹쌀동수육 2021. 11. 8. 01:37

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

[나의 생각]

일단 숫자를 각 자리수로 나누어 더하는 함수를 새로 생성해야 한다고 생각했다.

 

숫자를 각 자리수로 나누기 전에 주어지는 숫자의 갯수는 10,000보다 작거나 같은 숫자 중에 셀프넘버를 구함으로 자리수를 나누는 함수는 10,000자리 이내의 모든 숫자를 나눌 수 있도록 해야한다.

 

그러므로 주어지는 숫자는 한자리, 두자리, 세자리, 네자리의 경우로 나누고 10,000의 경우는 셀프넘버가 없음으로 제외한다.

 

메인 함수에는 0으로 초기화된 배열을 선언하고, 입력은 없음으로 바로 1부터 10,000까지 반복하면서 모든 값을 위의 함수를 사용하여 배열에 하나씩 넣도록 한다.

 

배열[1]은 1에 대한 셀프 넘버의 값이다.

 

배열이 0인 경우에 출력한다.

 

 

[구현]

배열의 개수를 10,050개로 넉넉히 잡아준다.

셀프 넘버가 존재하는 배열의 인덱스에는 1을 추가하고 배열에 0이 존재하면 출력하도록 한다.

#include <stdio.h>

int d_n(int a){
    if(a<=9 && a>=0){
        a = a + a + 0;
        return a;
    }
    else if(a<=99 && a>=10){
        a = a%10 + a/10 + a;
        return a;
    }
    else if(a<=999 && a>=100){
        a = a/100 + (a%100)/10 + a%10 + a;
        return a;
    }
    else if(a<=9999 && a>=1000){
        a = a/1000 + (a%1000)/100 + (a%100)/10 + a%10 + a;
        return a;
    }
}

int main(void){
    int arr[10050] = { 0, };
    int num=0;
    for(int i = 1;i<=10000;i++){
        num = d_n(i);
        arr[num] = 1;
    }
    for(int i = 1;i<=10001;i++){
        if(arr[i]==0){
            printf("%d\n", i);
        }
    }
    return 0;
}
 

 

'백준 문제풀이' 카테고리의 다른 글

[백준 문제 나의 풀이] 2563번 색종이  (0) 2021.06.28