본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 4673번: 셀프 넘버 C언어

문제 출처: 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

1. 코드

#include <stdio.h>

int check1(int n)     //10미만의 수 확인하는 함수
{
    if(n%2!=0)        //2의 배수가 아니라는 공통점 이용
        return 1;
    else
        return 2;
}
int check2(int n)           //10초과 100미만의 수 확인하는 함수
{
    int i, n10, n1, n11;	//n10 = i의 10의 자릿수, n1 = i의 1의 자릿수
    for(i=1; i<n; i++)
    {
        n10=i/10;
        n1=i%10;
        n11=i+n10+n1;
        if(n11==n)
            return 2;
    }
    return 1;
}
int check3(int n)                   //100초과 1000미만의 수 확인하는 함수
{
    int i, n100, n10, n1, n111;	    //n100 = i의 100의 자릿수
    
    for(i=1; i<n; i++)
    {
        n100=i/100;
        n10=(i-n100*100)/10;
        n1=i%10;
        n111=i+n100+n10+n1;
        if(n111==n)
            return 2;        
    }
    return 1;
}
int check4(int n)                           //1000초과 10000미만의 수 확인하는 함수
{
    int i, n1000, n100, n10, n1, n1111;	    //n1000 = i의 1000의 자릿수
    
    for(i=1; i<n; i++)
    {
        n1000=i/1000;
        n100=(i-n1000*1000)/100;
        n10=(i-n1000*1000-n100*100)/10;
        n1=i%10;
        n1111=i+n1000+n100+n10+n1;
        if(n1111==n)
            return 2;        
    }
    return 1;
}

int main(void)
{
    int n=1, i, check;
    
    for(i=0; i<10000; i++)        //1부터 10000까지 반복하여 확인
    {
        if(n<=10)
            check=check1(n);
        else if(n<100)
            check=check2(n);
        else if(n<1000)
            check=check3(n);
        else
            check=check4(n);
        
        if(check==1)              //1로 반환되면 출력
            printf("%d\n", n);
        n++;
    }
    return 0;
}

2. 느낀 점

첫 번째로 이 방법은 우선 돌아가게 만든 것입니다. 한마디로 좋은 프로그램이 아닌 것 같습니다. 이 방식은 그냥 계속해서 반복을 하여 풀어낸 코드라 더 좋은 코드를 보면서 배우면 좋을 것 같습니다.

그냥 아 이런 방식도 있구나 정도로 끝났으면 좋겠습니다. 저 같은 경우에는 이러한 방식 이외에는 떠오르지 않아 그랬지만 저 또한 다른 방식의 코드를 찾아보고 개선할 생각입니다.

이 방식은 한마디로 그냥 0부터 10000까지 하나씩 대입하여 맞추는 방식입니다. 좋은 코드는 아닌 것 같습니다.