coding_test/BAEKJOON

백준 4673번 C언어 풀이

CodeJin 2021. 8. 6. 16:06

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

실버티어 문제로 넘어오면서 머리가 정말 아프다;;

 

각설하고, 이번 문제는 어느 수학자가 정의한 셀프넘버에 관한 문제이다. n이라는 자연수에 대해 자기자신과 자기자신의 자리수를 합하는 함수 d(n)이라고 하자(이때의 n을 생성자라고 한다). d(75) = 75+7+5 = 87이 된다.

 

또한 셀프 넘버는 d(n)을 통해 나올 수 없는, 즉 생성자가 없는 숫자를 의미한다. 대표적으로 1, 3, 20 이 있다.

 

이 문제는 10000이하의 셀프 넘버를 모두 찾아 출력하는 문제이다. 

 

처음에는 d(n)을 역연산하여 생성자를 찾아볼까 생각했지만, 매우 힘들 것이라는 판단을 하여, d(n)으로 산출된 값을 지우는 방식을 택했다.

#include <stdio.h>

int d (int num) {
    int dnum;
    int a,b,c,d; // 천, 백, 십, 일의 자리수
    
    if (num > 0 && num < 10) {
        dnum = 2*num;
    } else if(num >= 10 && num < 100) {
        c = num / 10;
        d = num % 10;
        dnum = num + c + d;
    } else if(num >= 100 && num < 1000) {
        b = num / 100;
        c = (num / 10) % 10;
        d = num % 10;
        dnum = num + b + c + d;
    } else if(num >= 1000 && num < 10000) {
        a = num / 1000;
        b = (num / 100) % 10;
        c = (num / 10) % 10;
        d = num % 10;
        dnum = num + a + b + c + d;
    } 
    return dnum;
}

int main(){
    int t[10000] = {0,}; // 1만개의 숫자
    int n = 1; // 생성자

    while (n <= 10000) {
        if (d(n) <= 10000){
            t[d(n)-1] = 1; // d(n)으로 생성되었으므로 셀프넘버가 아님
        }
        n++;
    }
    for (int i = 0; i < 10000; i++) {
        if (t[i] == 0) { // 배열의 요소가 0이라는 것은 곧 셀프넘버라는 뜻
            printf("%d\n", i+1);
        }
    }
    return 0;
}