넥슨 입사문제 중에서

어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.

예를 들어

d(91) = 9 + 1 + 91 = 101

이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.

어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.

1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

2011/08/14 14:32

길가의풀

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

427개의 풀이가 있습니다. 30 / 43 Page

다른 분 코드 참고했어요


package codingdojang;
//num1
public class nexon {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        boolean[] num=new boolean[5001];
        int a,b,c,d,result, sum=0;
        for(int i=1;i<=5000;i++){
            a=i/1000;
            b=(i%1000)/100;
            c=(i%100)/10;
            d=(i%10);

            result=a+b+c+d+i;

            if(result>0&&result<=5000){
                num[result]=true;
            }

        }
        for(int i=1;i<=5000;i++){
            if(num[i]==false)
                sum+=i;
        }
        System.out.println(sum);
    }

}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
            const int MAX = 5000;

            var resultList = new bool[MAX]; 

            for (int i = 1; i < MAX; i++)
            {
                int temp = i;
                int sum = 0;

                while (temp != 0)
                {
                    sum += temp % 10;
                    temp /= 10;
                }

                sum += i;

                if (sum < MAX)
                    resultList[sum] = true;
            }

            int result = 0;

            for(int i = 1; i < MAX; i++)
            {
                result += resultList[i] ? 0 : i;
            }

            Console.WriteLine($"result : {result}");
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
clear;clc;
A=0;
for a=0:5
    for b=0:9
        for c=0:9
            for d=0:9  
            B=1001*a+101*b+11*c+2*d;
            if B > 5000
                B=0;
            end
            A=A+B;
            end
        end
    end
end
S=sum(0:5000); % 0부터 5000까지의 모든 합
D=S-A % 0부터 5000까지의 모든 합에서 모든 generator 수 들의 합 뺀거_즉  self_number 들의 합

ans=47830

뭐가 틀린거죠? MatLab 초보자인데 코딩이 참 어렵네요ㅡㅡ MatLab 고수님께 부탁합니다ㅠㅠ 제 코딩에서 도데체 뭐가 잘 못 된거죠??

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class newCompany {

    static int[] num ;
    static final int SIZE = 5000;
    public static void main(String argv[]) throws Exception {

        setNum(SIZE);

        System.out.println(setCal());


      }

    private static void setNum(int val){
        num= new int[val];
        for(int i = 0; i<SIZE; i++){

            num[i] = i;

        }

    }



    private static int setCal(){
        int temp = 0;
        int sum = 0;
        for(int i = 0; i<SIZE; i++){

            temp = i + divide(i);

            if(temp<SIZE)
            num[temp]= 0;

        }


        for(int i=0; i<SIZE; i++){

            sum+=num[i];

        }
        return sum;


    }

    private static int divide(int val){


        return val/1000+ (val%1000)/100 + (val%100)/10 + val%10;


    }


}

2017/01/18 10:30

lhc

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include<iostream>
using namespace std;

bool contain_num(int input)
{
    int count;
    int *generator = new int[input];
    for (int i = 1; i < input; i++)
    {
        if (i < 10)
        {
            generator[i - 1] = i + i;
        }
        else if (i < 100)
        {
            generator[i - 1] = (i / 10) + (i % 10) + i;
        }
        else if (i < 1000)
        {
            generator[i - 1] = (i / 100) + ((i / 10) % 10) + (i % 10) + i;
        }
        else if (i < 10000)
        {
            generator[i - 1] = (i / 1000) + ((i / 100) % 10) + ((i / 10) % 10)+ (i % 10) + i;
        }
    }
    for (count = 0; count < input; count++)
    {
        if (input == generator[count])
        {
            return false;
        }
    }
    if (count == input)
        return true;
}
int main()
{
    int sum = 0;
    for (int i = 1; i < 5000; i++) {
        if (contain_num(i) == true)
        {
            sum += i;
        }
    }
    cout << "합계 : " << sum << endl;
    return 0;
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

무식하게 풀어보았습니다.

def func(n):
    return [int(each_number) for each_number in str(n)]

def d(n):
    return sum(func(n)) + n

self_number = list()

for i in range(1, 5000):
    flag = True
    for j in range(1, 5000):
        if i == d(j):
            flag = False
            break
    if flag:
        self_number.append(i)

print(sum(self_number)) # 결과값 : 1227365

한 십몇초 걸리는군요. ㅠㅠ

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

아 java로 짰습니다. 왠지 부끄럽네요. ㅠㅠ

import java.util.ArrayList;

public class Generator {
    private ArrayList<Integer> ar= null;

    public Generator(){
        ar = new ArrayList<Integer>();
    }

    public static void main(String[] args) {
        Generator gen = new Generator();
        ArrayList<Integer> tempAr = gen.setArray();

        int sum = 0;

        for(int inx = 1; inx < 5000; inx++){
            if(tempAr.contains(inx) == false){
                sum = sum+inx;
            }
        }

        System.out.println("sum ==> " + sum);

    }

    public ArrayList<Integer> setArray(){
        for(int inx = 1; inx < 5000; inx++){
            ar.add(d(inx));
        }

        return ar;
    }   


    public int d(int number){
        int result = 0;

        String tempStr = "" + number;

        for(int jnx = 0; jnx < tempStr.length(); jnx++){
            result = result + Integer.parseInt(tempStr.substring(jnx, jnx+1));
        }

        result = result + number;
        return result;
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

c++입니다. 파이썬 코드를 보니 주눅드는군요.. ㅋㅋ

#define N 5000

void main(){
    bool* selfNums = new bool[N];
    memset(selfNums, false, N);

    int res = 0, sum = 0, val = 0;
    for(int i=1; sum<N; i++)
    {
        sum = val = i;
        while(val>=10)
        {
            sum += val%10;
            val /= 10;
        }
        sum += val;

        if(sum < N)
        {
            selfNums[sum] = true;
        }
    }

    for(int i=0; i<N; i++)
    {
        if(selfNums[i] == false)
        {
            res += i;
        }
    }

    delete[] selfNums;
    cout << res << endl;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <stdio.h>
/*
어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.

예를 들어

d(91) = 9 + 1 + 91 = 101
이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.

어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 
그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다. 
예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.

1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.
*/

/*
1.  1~5000 까지의 숫자의 모든 d(n) 을 정렬한 뒤 1~5000까지의 자연수중 없는 숫자를 Sum 한다.
2.  1~5000 까지의 숫자중 generator가 있는지 검사 후 없는 숫자를 Sum 한다.
*/
int main()
{
    // 방법 1
    {
        int sum = 0;
        const int MAX_Digit = 4;
        int _num;
        int div_num;
        int Gen_n = 0;

        int arr[10000];
        for (int num = 1; num < 5001; num++)
        {
            _num = num;
            div_num = 1;
            Gen_n = num;
            for (int i = 0; i < MAX_Digit; i++)
            {
                _num /= div_num;
                Gen_n += _num % 10;
                if (_num / 10 == 0)
                    break;
                div_num *= 10;
            }
            arr[Gen_n] = 1;

            if (arr[num] != 1)
            {
                sum += num;
                printf("num = %d\n", num);
            }
        }
        printf("sum = %d\n", sum);
    }

    return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def func_dn(n):
    return n + sum([int(ni) for ni in str(n)])

self_numbers = set(range(1,5000)) - set([func_dn(n) for n in range(1,5000)])

print('sum of self numbers:', sum(self_numbers))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 427
python x 149
기 타 x 67
java x 80
matlab x 5
scala x 9
cs x 16
cpp x 63
php x 6
delphi x 3
ruby x 6
haskell x 2
lisp x 2
javascript x 5
r x 3
clojure x 2
erlang x 1
perl x 1
objectivec x 5
go x 2