4673번: 셀프넘버 -> https://www.acmicpc.net/problem/4673


분류로는 함수 사용하기 단계로 분류되어있다. 문제는 들어가서 직접 읽어보시길 바람.

근데 다들 풀다 막혀서 들어오셨을것 같지만..


셀프넘버는 옛날 넥슨 입사문제로도 사용되었다고 하는 문제인데 그만큼 생각보다 까다로운 문제더라..

(수많은 흔적들)



우선 n과 n의 각 자리수를 더하는 함수는 쉽게 만들수있다. (다들 여기까진 금방하셨을듯)

1
2
3
4
5
6
7
8
9
10
11
int d(int n)
{
    int sum = n;
    while (n != 0)
    {
        sum += n % 10;
        n = n / 10;
    }
 
    return sum;
}
cs

n에 39을 넣으면 39 + 3 + 9 = 51이 나올 것이다.



여기서 나는 bool형 배열을 만든 후에 생성자가 있는 숫자만 카운트하여 true로 만들어줬다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
main()
{
    bool c[10001= { false };
 
    for (int i = 1; i <= 10000; i++)
    {
        int k = d(i);
        if(k<=10000)
            c[k] = true;
    }
    for (int j = 1; j <= 10000; j++)
    {
        if (!c[j])
            cout << j << "\n";
    }
}
cs

즉 i에 39가 들어가면 k는 51이 되므로 51은 생성자가 있는 숫자니까 51번째 배열은 true로 만드는거.

그렇게 1~10000까지의 생성자가 있는 숫자들만 찾은 후 

반대로 값이 false인것만 출력해 생성자가 없는수. 즉 셀프넘버를 찾아내었다.


풀고나서 인터넷에서 좀 찾아봤는데 이런방식으로 푼 사람들이 가장 많긴하더라.

다 만들고나서도 비쥬얼스튜디오에선 잘돌아가는데 백준에 내면 틀렸다하고,  원인찾느라고 몇번은 더 한듯.

Posted by misty_
,