이 페이지는 코딩도장 데이터의 읽기 전용 정적 보관본입니다.

넥슨 입사문제 중에서

어떤 자연수 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

pahkey

1110개의 풀이가 있습니다.

위의 파이선코드들을 참조 했습니다.

sum(set(range(1, 5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)})

python 2.7.3

2014/02/04 14:36

BangC

+9 거의 예술이네요 - 엄마아빠아들입니다, 2014/08/14 18:37
x에 91과 100이 들어가면 둘다 101이 앞의 sum에서 빼질텐데 어떻게 한번만 빼지는것이 되죠?? - 왈왈, 2016/07/08 19:05
+1 차집합이라 없으면 그냥 지나갑니다. - Flair Sizz, 2016/07/13 22:08
+3 울었다 .... - sega, 2016/08/22 18:45
sum() 이라는 함수를 처음 알게 되었네요. 한 수 배워갑니다 - 박지상, 2017/06/27 14:39
세상은 넓고 고수는 정말 많다;; comprehension 의 끝판왕이시네요 - 이호재, 2018/06/19 21:56
감동먹었습니다. - Hyuk, 2019/04/16 17:45
대단합니다...저는 절대로 그렇게 못할껏 같은데...와...... - Firelight, 2019/05/26 21:05
제 풀이와 방법은 동일한데, 이걸 단 한줄로 ... 대단하십니다. - 불나방, 2019/08/05 20:44
+1 x에 91과 100이 들어가면 둘다 101이 앞의 sum에서 빼질텐데 어떻게 한번만 빼지는것이 되죠?? >> set이 리스트 함수이고 원소가 중복되지 않는 특성이 있습니다. 리스트에서 101을 2번을 빼든 3번을 빼든 똑같습니다. 그리고 남은 원소들만 sum해주기 때문에 중복은 없습니다. - ChoiGoBin, 2019/08/21 21:29
봐도 모르겠네요 예술의 경지 - WB, 2020/05/12 11:01
대단하다는 말 밖에는... - siu yoon, 2023/07/20 14:44

Python으로 작성해 보았습니다.

처음에 만든 코드는 아래와 같았습니다.

def d_fn(n):
    y = n
    while n > 0:
        y += n % 10
        n //= 10
    return y

Z = [d_fn(n) for n in range(5000)]
A = [n for n in range(5000) if n not in Z]
print (sum(A))

그 다음에는 문자열을 사용해서 조금 더 짧게 고쳐봤습니다.

def d_fn(n): return (n + sum([int(x) for x in str(n)]))

Z = [d_fn(n) for n in range(5000)]
A = [n for n in range(5000) if n not in Z]
print (sum(A))

여기에 아래와 같이 집합 데이터 구조를 사용해 보니 더 직관적으로 고쳐지는 것 같습니다.

def d_fn(n): return (n + sum([int(x) for x in str(n)]))

S = set(range(5000))
Z = set([d_fn(n) for n in range(5000)])
print (sum(S-Z))

2012/06/19 11:21

njturtle1

와.. 깔끔한 파이썬코드, 언제나 반갑네요 ^^ - pahkey, 2012/06/19 16:24
저는 1줄짜리 파이썬 코드가 예술로 보이긴하지만 가독성을 높이기는 이게 더 좋은 것 같습니다. 추천주고 갑니다 - 전영배, 2015/06/12 02:19

파이썬의 def를 사용하지 않고 set() 의 차집합을 이용해서 작성해보았습니다.

nums = range(1,5001)
selfnums = set(nums) - set([sum([int(ii) for ii in str(num)]) + num for num in nums])

print sum(selfnums)

2014/06/07 03:09

keepgoingtogether

파이썬 3.2.5 기준입니다.

def d(number):
    total = number
    number = str(number)
    for i in number:
        total += int(i)
    return total

self_number_total = 0
self_number_set = set()

for i in range(1,5000):
    self_number_set.add(d(i))

for i in range(1,5000):
    if not i in self_number_set:
        self_number_total += i

print(self_number_total)

2014/05/23 22:50

Youngjin Shin

코딩도장 자주 애용할 듯 합니다ㅎㅎ 자바에요

public class SelfNumber {

    public static void main(String[] args) {
        // 1~5000 까지
        // generator 로 돌려서 각 값을 배열에 저장
        // 그중 1~5000과 일치하지 않는 수를 골라낸다
        // int 를 나눌 경우 소수점 이하는 계산에서 무시되므로 int를 사용

        Integer a,b,c,d,result,sum=0;

        boolean[] generated = new boolean[5000];

        for(int generator=1; generator<5000;generator++){
            a = generator/1000;
            b = (generator/100)%10;
            c = (generator/10)%10;
            d = generator%10;

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

            if((result>=1)&&(result<5000)){
                generated[result] = true;
            }
        }

        for(int i=1; i<5000; i++){
            if(generated[i]==false){
                sum = sum + i;
            }
        }

        System.out.println("Self-Number의 합계는 : " + sum);

    }
}

2014/06/17 15:01

이재범

public static void main(String[] args)
    {
        calculateNumbersHasGenerator();
        int sum = 0;
        for (int i = 0; i < 5001; i++)
            if (!hasGenerator(i))
                sum += i;
        System.out.println("합 : "+sum);
    }

    private static boolean hasGenerator(int num)
    {
        return numbersHasGenerator.contains(num);
    }

    private static ArrayList<Integer> numbersHasGenerator;

    private static void calculateNumbersHasGenerator()
    {
        numbersHasGenerator = new ArrayList<Integer>();
        for (int i = 0; i <= 5000; i++)
        {
            String num = String.valueOf(i);
            int no = 0;
            for (int n = 0; n < num.length(); n++)
                no += Integer.parseInt(num.substring(n, n + 1));
            numbersHasGenerator.add(no + i);
        }
    }

합 : 1227365

자바로 짯습니다. 코딩 퀴즈 재밌군요. 아직 많이 부족한 실력이라, 적극적인 지적 환영합니다.

2012/02/04 17:47

이학수

+1 for (int i = 0; i < 5001; i++) 여기서 5000 이 맞겠군요. 5000 보자 작은 숫자이니.. 문제를 잘못봐서.. - 이학수, 2012/02/04 17:50
#include <stdio.h>
int getValueByGenerator(int);

int main(){
    int num[5000];
    int haveGenerator[5000] = {0,};
    int i =0;
    int result = 0;

    // n은 항상 d(n)보다 작으므로
    // i를 Generator로 가지는 값을 구하여 배열에 저장
    for(i=1; i<=5000; i++)
        num[i-1]= getValueByGenerator(i);

    for(i=0; i<5000; i++){
        // 1. num[i]값을 참조하여 Generator를 가졌는지 판단
        // 2. 5000이하인 경우 해당 인덱스 참조하여 Generator를 가졌는지 표시(1 = have, 0 = donthave)
        if(num[i] <= 5000)
            haveGenerator[(num[i] -1)] = 1;
    }

    // Generator를 가지지않은 값들을 모두 합하여 결과도출.
    for(i=0; i<5000; i++){
        if(haveGenerator[i] == 0){
            result += (i+1);
            printf("%d ", i+1);
        }
    }

    printf("\n\nresult : %d\n", result);
    return 0;
}

int getValueByGenerator(int x){
    return (x + x/1000 + (x%1000)/100 + (x%100)/10 + x%10);
}
합 : 1227365

*풀이방법 -> 주석

2015/10/06 15:33

jace

J를 이리 저리 익혀 보려고 하고 있는데 손에 잘 안 익네요. 그래도 일단 풀긴 풀었습니다. 그다지 깔끔한 것 같지 않은데 J 하시는 분들의 가멸찬 지적 바랍니다...

   +/I.-.(e.(++/"1@(10&#.^:_1)))i.5001
1227365

처음부터 이렇게 만들었다는 소리는 아니고요, 대강 이렇게 구성됩니다.

   digits =: #.^:_1
   digits10 =: 10 & digits
   digits10 4057 2289
4 0 5 7
2 2 8 9

J에 내장되어 있는 #.(base)라는 함수는 오른쪽의 인자들을 2진법(또는 왼쪽 인자가 있으면 그 진법)으로 해석해서 하나의 숫자로 만듭니다. 이를테면 "#. 1 1 0 1"은 13이 되겠죠. ^:_1는 함수의 의미를 뒤집는 역할을 합니다.

   +/ digits10 4057 2289
6 2 13 16
   +/"1 digits10 4057 2289
16 21

J에서 배열의 합을 구할 때는 흔히 +/(sum)을 씁니다만 이 경우 오른쪽 인자가 여럿일 때도 동작해야 하기 때문에 행과 열을 잘 생각해야 합니다. +/(좀 더 정확히는, /)의 기본값은 열 별로 더하는 것이므로 이 동작을 바꾸려면 "1로 rank를 바꿔 줘야 합니다.

   digitsum =: +/"1 @ digits10
   d =: + digitsum
   d 2289
2310

고로 digitsum은 오른쪽 인자를 10진법 자릿수로 나눈(digits10) 것을 행 별로 다 더한(+/"1) 것으로 정의할 수 있습니다. 함수 d(x)는 당연히 x + digitsum(x)로 정의되는데, J의 fork를 사용하면 코드가 좀 더 간단해집니다. 사실 이렇게 안 하면 괜시리 복잡해지기도 하고요.

   i.20
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   d i.20
0 2 4 6 8 10 12 14 16 18 11 13 15 17 19 21 23 25 27 29

이제 앞에서 정의했던 d를 가지고 self number의 목록을 구합니다. i.(integers)는 0부터 주어진 인자 빼기 1까지를 담은 배열을 만들고(파이썬의 range와 거의 비슷합니다), 앞에서도 살펴 봤지만 배열에 함수를 적용하면 배열 각 원소에 함수가 모두 자동으로 적용됩니다. (+/와 같이 다른 형태로 동작하는 경우도 물론 있습니다.)

   (i.20) e. (d i.20)
1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1
   (e. d) i.20
1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1

e.(member)를 써서 집합 빼기(set difference) 비스무리한 걸 구현할 수 있습니다. (d에 ^:_1을 적용할 수 있으면 참 좋겠지만 d의 역함수는 애초에 함수가 아닙니다...) 앞에서 fork 얘기를 했는데 여기서도 한 번 더 쓰게 되네요.

   -. (e. d) i.20 
0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0
   I. -. (e. d) i.100
1 3 5 7 9 20 31 42 53 64 75 86 97
   +/ I. -. (e. d) i.5001
1227365

-.(not)을 써서 0과 1을 뒤집은 뒤, I.(indices)를 써서 1이 있는 칸의 인덱스만 빼 오면 d의 반환값에 나오지 않았던 모든 숫자들을 구할 수 있습니다. 그 결과를 모두 더하면(이번에는 그냥 +/로) 결과를 얻을 수 있습니다. 맨 위의 코드는 이 코드에서 공백 떼고 d를 안에 넣어서 완성한 것입니다.

2012/02/04 15:04

아라크넹

지금 보니까 #.(base)의 반대 되는 역할을 하는 #:(antibase)가 이미 내장으로 있었네요. Vocabulary를 아무리 봐도 헷갈리는 듯... - 아라크넹, 2012/02/05 00:52
-1 놀라울 따름입니다. 친절히 해석도 달아주셨으니 시간내서 공부좀 해 봐야 겠네요 ^^ - pahkey, 2012/02/05 14:49
-1 J 실력이 지금보다 좀 미천했을 때 푼 방식입니다: http://agile.egloos.com/1718200 - 김창준, 2012/03/04 22:35
import math
def d(x):
    x=str(x)
    s=int(x)
    for i in x:
        s+=int(i)
    return s
s=0
i=1
a=d(i)
while a<5000:
    s+=a
    i+=1;a=d(i)


print((4999*5000/2)-s)

2014/09/06 01:28

이병곤

    Sub Main()
        Dim result As Integer = 0
        Dim ht As New Hashtable

        For i As Integer = 1 To 4999
            Dim n As Integer = GetGenerator(i)

            If n < 5000 Then
                ht.Add(i, n)
            End If
        Next

        For i As Integer = 1 To 4999
            If Not ht.ContainsValue(i) Then
                result += i
            End If
        Next

        Console.WriteLine("Result: " & result)

        Console.ReadLine()
    End Sub

    Public Function GetGenerator(n As Integer) As Integer
        Return n + (From str In n.ToString.ToArray Select Integer.Parse(str)).ToArray.Sum
    End Function

1227365

2015/06/12 02:21

Steal

#include <iostream>

using namespace std;

static const int N = 5000;

int d(int n)
{
  int res = n;
  while (n != 0) { res += n % 10; n /= 10; }
  return res;
}

int main()
{
  bool isSelfNo[N + 1];
  for (int i = 0; i <= N; i++) isSelfNo[i] = true;
  int sumOfSelfNo = 0;
  int n = 1;
  while (n <= N)
  {
    if (isSelfNo[n]) sumOfSelfNo += n;
    int _d = d(n);
    if (_d <= N) isSelfNo[_d] = false;
    n++;
  }
  cout << sumOfSelfNo << endl;
}

이렇게 하면 되나염?

2012/03/27 21:00

이경문

모든 자연수는 자신의 generator 보다 클 수 밖에 없으므로(각 자릿수의 합은 항상 0보다 크기 때문에) 1 이상 5000 미만의 self-number 를 알기 위해선 1 이상 5000 미만인 수들을 generator 로 하는 수들을 key 로 하고 아무 값을 value로 하도록 비어있는 dictionary에 모두 저장한뒤 다시 1부터 4999 까지 반복문을 돌려서 dictionary에 해당 숫자를 key 로 갖는 값이 존재하는지 검사해서 없으면 sum 에 누적시키면 1 이상 5000 미만의 self-number 의 합이 된다. (왜냐하면 1 이상 5000 미만인 수들이 가질 수 있는 모든 가능한 generator 들을 이용하여 generate 하였으므로 해당 숫자의 key 를 갖는 값이 없다면 self-number 인 것이다.) 답은 1227365

def generate(num):
    res = 0
    for i in str(num):
       res = res + int(i)
    return res + num

dic = dict()

for i in range(1,5000):
    dic[generate(i)] = 1

res = 0

for i in range(1,5000):
    if not dic.has_key(i):
        res = res + i

print res

(python 2.7 기준)

2014/06/29 17:57

황 성호

scala> def d(n: Int): Int = {
     | n + n.toString.map(_.asDigit).sum
     | }
d: (n: Int)Int

scala> (1 to 5000) diff (1 to 5000).map(d) sum
res7: Int = 1227365

2014/12/04 17:03

killbirds

generator = @ (n) sum(int2str(n)-'0')+n;
range = 1:5000;
num = range;
for n=range
    num(generator(n)) = 0;
end
sum(num(range))

2015/02/24 00:23

그린구름

..

/*****************************************************************************************************************************
 * 어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.
 *****************************************************************************************************************************/
import java.util.ArrayList;

//1. self-number가 아닌 숫자를 찾아 리스트로 정리한다.
//2. 1 - 4999중 해당 리스트에 포함되지 않는 숫자를 전부 더한다.

public class Generator {
    //5000은 포함 하지 않는다
    private static final int LIMIT = 4999;

    //generator를 가지는 1 - LIMIT 범위 내의 숫자 목록
    private static ArrayList<Integer> notSelfNumberList;

    public static void main(String[] args) {
        initNotSelfNumberList();

        printTotalSelftNumberSum();
    }

    //not self-number list 셋팅
    public static void initNotSelfNumberList() {
        notSelfNumberList = new ArrayList<Integer>();

        //5000보다 작으며 5000에 가장 근접한 self값을 모르며 제한되는 generator를 모르기 때문에 LIMIT까지 진행.
        for (int i = 0; i <= LIMIT ; i++) {
            //해당 숫자를 generator로 가지는 값을 찾아 낸다.
            //찾아낸 수는 generator를 가지고 있으므로 notSelfNumberList에 포함 한다.
            //이때 생성된 수가 최초로 LIMIT값을 넘게 되는 순간 break(해당 숫자는 notSelfNumberList에 포함 안함)

            String strNum = String.valueOf(i);

            //자기 자신도 더해야 하므로 우선 자기 자신을 최초 숫자로 셋팅
            int notSelfNumber = i;
            //각 자리수를 전부 분해하여 더한다.
            for (int idx = 0; idx < strNum.length(); idx++) {
                notSelfNumber += Integer.parseInt(strNum.substring(idx, idx+1));
            }

            //더한 숫자가 한도 범위를 벗어 난다면 for문 중단.
            if (notSelfNumber > LIMIT) break;

            //한도를 넘지 않았다면 not self-number list에 포함
            notSelfNumberList.add(notSelfNumber);
        }
    }

    public static void printTotalSelftNumberSum() {
        int sum = 0;

        //1부터 LIMIT까지 진행
        for (int i = 1; i <= LIMIT; i++) {
            //not self-number list에 포함되어 있다면 통과
            if (notSelfNumberList.contains(i)) continue;

            //아니라면 최종합에 더하기.
            sum += i;
        }

        System.out.println("1 부터 " + LIMIT + "까지 self-number 가 아닌 모든 수의 합 : " + sum);
    }

}

결과는 1227365가 나오네요 ㅎㅎ
우연히 이곳을 알게 되었는데 많이 활성화 되면 좋겠습니다.
더불어 퀴즈도 많아지면 재미있겠네요

2012/05/30 13:38

Seo Bongki

셀프넘버의 합계를 구하는거 아닌가요? cmd만 봐서는... - 김세연, 2014/02/28 10:46

ruby

([*1..5000] - (1..5000).map{|i| i.to_s.split("").map(&:to_i).reduce(:+)+i}).reduce(:+)

2013/06/10 08:18

Shim Won

python 2.4 으로 풀었습니다. 코드가 이쁘지는 않습니다.

우선 d(n) = n + (n 각자리수 합) 이므로 1~5000의 셀프넘버를 구하는데 제네레이터 값이 5000보다 클수는 없다고 보고서 풀었습니다.

전체 코드입니다.

def main():
    l = range(1, 5000)

    for i in range(1, 5000):
        if l.count(d(i)):
            l.remove(d(i))

    print sum(l)

def d(n):
    s = str(n)
    sum = 0
    for i in range(0, len(s)):
        sum = sum + int(s[i])

    return sum + n

if __name__ == '__main__':
    main()

먼저 d(n) 함수를 만들어 놓은뒤 제네레이터 값을 1~5000 까지 넣으면서 나오는 d(n) 의 값들을 1~5000 사이에서 빼는 형식으로 처리한 뒤에 합쳤습니다. 답은 맞게 나온거 같지만 코드가 이쁘지 않은것이 마음에 걸리네요... 추가 조언 주시면 많은 참고 하겠습니다.

2014/03/28 14:02

KwonH

자바로 짜봤습니당

import java.util.Hashtable;

public class SelfNumberSum {

    public static void main(String[] args){

        int result = 0;
        int generatorNum=0;
        final int MAX_NUMBER = 5000;

        Hashtable v = new Hashtable();
        SelfNumberSum sum = new SelfNumberSum();

        // 1.generating generator number.
        for(int i=1; i<=MAX_NUMBER; i++){
            generatorNum=sum.getGenerator(i);
            if(generatorNum<MAX_NUMBER){
                v.put(i,generatorNum);
            }
        }

        /// 2.finding SelfNumber
        for(int i=1; i<MAX_NUMBER; i++){
            if(!v.containsValue(i)){
                result += i;
            }           
        }

        System.out.println("self-number sum : " + result);

    }

    private int getGenerator(int generator){

        int substrSum=0;
        String numberStr = Integer.toString(generator);
        int substrLength = numberStr.length();

        for(int i=0; i<substrLength;i++){
            substrSum+=Integer.parseInt(numberStr.substring(i,i+1));
        }
        substrSum += generator;

        return substrSum;
    }



}

2015/01/22 02:41

mojo_kb

coding by python beginner

def d(n):
    sum = n
    for i in str(n): sum += int(i)
    return sum

gen = 1; nonSelfNums = []
while True:
    nonSelfNum = d(gen)
    if nonSelfNum >= 5000: break
    nonSelfNums.append(nonSelfNum)
    gen += 1        

print( sum( set(list(range(1, 5000))) - set(nonSelfNums) ) )

2015/02/03 10:49

vegan

        static void Main(string[] args)
        {
            Hashtable hst = new Hashtable();
            int Sum = 0;

            for (int i = 0; i < 5000; i++)
            {
                int tmp = jene(i);
                if (tmp < 5000)
                {
                    hst.Add(i,tmp);
                } 
            }

            for (int i = 0; i < 5000; i++)
            {
                if (!hst.ContainsValue(i))
                {
                    Sum += i;
                }
            }

            Console.WriteLine(Sum);
        }

        public static int jene(int Ine)
        {
            int result = 0;   

            string Tmp = Ine.ToString();


            int[] TmI = new int[Tmp.Length];


            for (int i = 0; i < Tmp.Length; i++)
            {
                TmI[i] = Convert.ToInt32(Tmp[i].ToString());
            }

            result += Ine;

            for (int i = 0; i < TmI.Length; i++)
            {
                result += TmI[i];
            }

            return result;
        }

2015/06/14 15:53

허 빈

#include <iostream>

using namespace std;
void calDNNumbers();
bool isNotSelfNumber(int number);

int dnNumbers[5000] = {0, };

int main() {

    int sum = 0;

    calDNNumbers();

    for(int i=1; i<=5000; i++) {
        if(!isNotSelfNumber(i)) {
            sum+=i;     
                }
    }

    cout << sum;
}

void calDNNumbers() {
    int f[4] = {0};

    for(int i=0; i<5000; i++) {
        f[0]=0, f[1]=0, f[2]=0, f[3]=0;
        f[0] = (i+1)/1000;
        f[1] = ((i+1)%1000)/100;
        f[2] = ((i+1)%100)/10;
        f[3] = (i+1)%10;

        dnNumbers[i] = f[0]+f[1]+f[2]+f[3]+(i+1);       
    }

}

bool isNotSelfNumber(int number) {
    bool isNotSelfNumber = false;
    for(int i=0; i<5000; i++) {
        if(dnNumbers[i]==number) {
            isNotSelfNumber = true;
            break;
        } 
    }
    return isNotSelfNumber;
}

2015/10/08 01:59

서영주

Java8을 활용하여 만들었습니다.

public static void main(String[] args){
    Set<Integer> set = new HashSet<>();
    IntStream.rangeClosed(1, 5000)
             .forEach(x -> set.add(String.valueOf(x).chars().sum() + x));
    int sum = IntStream.rangeClosed(1,5000)
                   .filter(x -> !set.contains(x))
                   .sum();
    System.out.println(sum);
}

2015/11/07 05:41

김 문찬

String.valueOf(x).chars().sum() 여기서 char 값을 바로 합하면 아마 숫자값이 아닌 숫자의 캐릭터 코드 값이 합해질거에요. - compert, 2016/10/29 00:53

파이썬 2.7.6 입니다.

def d(n):
    return n + sum(int(x) for x in str(n))
L = [x for x in range(5001)]
for n in L:
    if n == 0 : continue
    while d(n) <= 5000 :
        L[d(n)] = 0
        n = d(n)
print sum(L)

2016/01/13 22:30

상파

PHP 로 작성했습니다. 초기배열 인덱스와 값을 맞춰주기위해 0~4999로 설정했구요.. (0은 뭐 껴있어도 상관없으니) 제너레이터의 결과값을 그대로 인덱스를 찾아 제거하는 용도로 사용했습니다.

$array = range(0,4999);

for($i=1; $i<=5000; $i++) {
    unset($array[array_sum(str_split((string)$i))+$i]);
}

echo array_sum($array);

2016/06/04 00:54

허큐리

#include <iostream>
#include <string>

using namespace std;

#define MAX 5000

bool list[MAX] = { false };
int Generator(int num) {
    int res = num;

    while (num != 0)
    {
        num /= 10;
        res += num % 10;
    }
    return res;
}


int main()
{
    for (int i = 1; i < MAX; i++) {
        list[Generator(i)] = true;
    }

    for (int i = 1; i < MAX; i++) {
        if (list[i] == 0) cout << i << endl;
    }

    return 0;
}


2016/08/08 17:11

장 윤형

Scala

(1 to 5000).filter(i => {
    !(1 until 5000).map(i => {
        var f = i
        var s = i
        while (f > 0) {
            s = s + (f % 10)
            f = f / 10
        }
        s
    }
    ).toList.contains(i)
}).foldLeft(0) { (a: Int, b: Int) => a + b }

2017/01/13 18:39

genius.choi

/**
  * Created by ReolSt on 2017-07-18.
  */
object NexonGenerator
{
  private val A : IndexedSeq[Int] = (1 to 5000) map(x => D(x,s"$x",0,x)) filter(_ <= 5000)
  def D(N : Int, NL : IndexedSeq[Char], i : Int, Result : Int) : Int =  if(i < NL.length - 1) D(N,NL,i+1,Result + NL(i).toInt - 48) else Result + NL(i).toInt - 48
  def main(args: Array[String]): Unit = print(((1 to 5000) filter(x=> A.lastIndexOf(x) == -1)).sum)
}

스칼라로 풀어봤습니다.

2017/05/24 22:11

S ReolSt

# 각 자리 숫자 들의 합
def sum_digit(n):
    if n >= 0 and n < 10:
        return n
    str_n = str(n)
    return sum_digit(int(str_n[:-1])) + int(str_n[-1])

# 각 자리 숫자들의 합 + 그 숫자
def sum_digit_itself(n):
     return n + sum_digit(n)

# 셀프 제너레이터가 있는 숫자들의 리스트
i = 1
sum = []
while sum_digit_itself(i) < 5000:
    new_num = sum_digit_itself(i)
    if new_num not in sum:
        sum.append(new_num)
    i += 1

# 1 부터 5000 까지 셀프 제너레이터가 없는 숫자들의 합
answer = 0
for i in range(1, 5000):
    if i not in sum:
        answer += i

print(answer)

2017/09/06 03:15

Stan_the_man

nonself=[]

for i in range(1,5000):
    string = str(i)
    nstr = len(string)
    d_n=i
    for j in range(0,nstr):
        d_n = d_n + int(string[j])
    nonself.append(d_n)

sumself=0
for iself in range(1,5000):
    if iself not in nonself:
        sumself=sumself+iself
print sumself

2017/12/01 06:04

영이

#include <stdio.h>

int main()
{
    int n = 5000, temp, re, i, j,k;
    re = n * (n + 1) / 2;
    for (i = 1; i<n + 1; i++) {
        for (j = (i - 40>1) ? i - 40 : 1; j<i+1; j++) {
            temp = j;
            k = j;
            while (k >= 1) {
                temp += k % 10;
                k = k / 10;
            };
            if (i == temp)
            {
                re -= i; break;
            }
        }
    }
    printf("%d", re);
    return 0;
}

2018/02/27 14:02

탁성하

Swift로 해봤습니다.

import Foundation

func getGeneratedNumber (_ number : Int) -> Int {
    return String(number).reduce(0, {return $0 + Int(String($1))!}) + number
}

var selfNumbers = Set<Int>(1..<5000)
for i in 1..<5000 {
    selfNumbers.remove(getGeneratedNumber(i))
}
print(selfNumbers.reduce(0, +))

2018/03/17 02:00

졸린하마

// python version. // almost copycat top rank code.

print(sum(range(5000)) - sum(filter(lambda x: x < 5000, set(x + sum(int(a) for a in str(x)) for x in range(5000)))))

2018/05/01 18:38

Wilde Oscar

def p365_fn(n):
    return n + sum(int(x) for x in str(n))

def p365():
    d_list = set()
    for i in range(1,5000):
        d_list.add(p365_fn(i))

    n_list = set(range(1,5000))
    print(sum(n_list-d_list))


#####################################
if __name__ == "__main__":
    p365()

2018/05/08 23:12

guruchun

nums_g=[]
for i in range(1,5000):
    num_g = i + sum(int(t) for t in str(i))
    nums_g.append(num_g)
result = set(range(1,5000)) - set(nums_g)
sum(result) # 1227365

2018/06/21 19:35

Seohyun Choi

a = [sum(map(int,str(i)))+i for i in range(1, 5000)]
print(sum(i for i in range(1,5000) if i not in a))

2018/07/07 04:18

Creator

num_list = []
for l in range(1, 5000):
    num_list.append(l)

gen_dic = {}

#N 이하의 숫자중 제네레이터 찾기
def gen_maker(N):
    for i in range(1, N):
        if i >= 1000:
            a1 = i // 1000
            a2 = (i-a1*1000) // 100
            a3 = (i-(a1*1000)-(a2*100)) // 10
            a4 = i-(a1*1000)-(a2*100)-(a3*10)
            gen_dic[i] = i + a1 + a2 + a3 + a4
        elif i >= 100:
            a1 = i // 100
            a2 = (i - a1*100) // 10
            a3 = i - a1*100 - a2*10
            gen_dic[i] = i + a1 + a2 + a3
        elif i >= 10:
            a1 = i // 10
            a2 = i - a1*10
            gen_dic[i] = i + a1 + a2
        else:
            gen_dic[i] = i + i


gen_maker(5000)
gen_list = list(gen_dic.values())

#제네레이터와 일반 숫자간에 차이 구하기
self_list = []
def check_gen():
    for m in num_list:
        if m not in gen_list:
            self_list.append(m)
        else:
            pass

check_gen()

#self number간의 합 구하기
Sum_self = 0
for c in self_list:
    Sum_self += c

print(Sum_self)

다른 분들 보니까 제 코드가 쓸데없이 너무 긴거 같네요... 아직 초보의 머리로는 저거 밖에 떠오르지 않습니다

2018/10/05 00:03

농창

public class MJ365 { public static int generate(int n) { int re=n; while(n!=0) { re=re+n%10; n=(int)(n/10); } return re;

}
public static void main(String args[]) {
    int[] self = new int [5001];
    for(int i=1; i<=4975; i++) {
        self[generate(i)]=self[generate(i)]+1;
    }
    int n=0;
    for(int j=1; j<=5000; j++) {
        if(self[j]==0) {
            n=n+j;
        }
    }
    System.out.println(n);
}

}

2019/10/03 13:55

이영준

import java.util.ArrayList;
import java.util.Collections;

public class 넥슨입사문제중에서 {

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int s = 0; s<5001; s++) {
            list.add(s);
        }
        for(int i=0; i<5001; i=i+1000) {
            for(int j=0; j<901; j=j+100) {
                for(int k=0; k<91; k=k+10) {
                    for(int l=0; l<10; l++) {
                        int num=0;
                        num=i+j+k+l+(i/1000)+(j/100)+(k/10)+l;
                        if(list.contains(num)) {
                        Collections.replaceAll(list, num, 0);
                    }
                    }
                }
            }
        }
        int sum = 0;
        for(int a = 0; a<list.size(); a++) {
            sum+=list.get(a);
        }
        System.out.println(sum);
    }
}

2019/11/14 21:03

big Ko

function solution() {

            var generator = 0;
            var b_sum = 0;
            for ( var list = 1; list < 5000; list++ ) {
                var flag = false; // flag 초기화를 해준다.
                for ( var i = 1; i < list; i++ ) { // 999 일 경우
                    generator = 0;
                    var j = i.toString().split( "" ); // 9 9 9
                    for ( let k = 0; k < j.length; k++ ) {
                        generator += parseInt( j[ k ] ); // 9+9+9
                    }
                    generator += i; // 9+9+9+999 = 1026
                    if ( generator == list ) {
                        flag = true; // generator 와 list 값이 같은 경우 flag에 true 값을 저장 후
                        break; // 반복문을 빠져 나간다.
                    }
                }
                if ( !flag ) { // flag 가 true 인경우만 ( 셀프 넘버 인경우만 )
                    b_sum += parseInt( list ); // b_sum에 합을 더한다.
                }
            }
            console.log( b_sum ); // 1227365
        }

2020/01/10 09:38

매료매료

   function SumSelfNunber(){

        var total_sum = 0;
        for(var i = 1; i < 5000; i++){
            var notselfNumber = false;

            for(let c = 1; c < i; c++){
                var sum = parseInt(c /1000) + parseInt((c % 1000) / 100) + parseInt((c % 100) / 10) + parseInt(c % 10) + c; //제네레이터의 sum
                if(sum == i ){ //셀프넘버 체크.
                    notselfNumber = true; 
                    break;
                }
            }
            if(!notselfNumber)
                total_sum += parseInt(i);
        }
       console.log(total_sum);
    }

2020/01/10 10:23

왈왈

A= set(range(1,5000))

b=[]

for i in range(1,5000):

    c = (i + sum([int(a) for a in str(i)]))

    b.append(c)

B = set(b)

print(sum(A-B))

2020/02/13 14:29

HyukHoon Kim

a = set(range(1,5000))
generator_set = set()

for i in range(1,5000):               # 1부터 4999까지 자신과 각 자리의 수를 합하여 5000보다 작으면 generator_set에 추가
    n = 0
    for j in range(len(str(i))):
        n += int(str(i)[j])

    if i+n <5000:
        generator_set.add(i+n)    

selfnum_set = a - generator_set           # 1부터 4999까지를 요소를 갖는 세트에서 generator_set와 차집합 연산으로 셀프넘버 세트를 만듬
sum(selfnum_set)                         # 셀프넘버들의 합

2021/11/29 11:15

황성민

generator = lambda a: sum(int(i) for i in str(a))+a
dn_list = [generator(x) for x in range(5000)]
print(sum(set([x for x in range(5000)]) - set(dn_list)))

2022/01/28 10:47

로만가

lambda 함수를 사용한 사례가 있어서 하나 더 만들었네요.. - 로만가, 2022/01/28 10:48
pythonic 한 코드 같아서 좋아보였습니다. 그런데 쥬피터에서 실행해보니 "'int' object is not callable" 에러메세지가 뜨네요... 첫줄에서 그렇다는데 왜 그럴까요? - Charles, 2022/03/23 14:33
제 colab이 잠시 이상했나봐요... 다시 해보니 되네요~ 멋져요!! - Charles, 2022/03/23 14:43
def is_self_number(num): #파라미터가 self number일때 스스로를 출력하는 함수
  for i in range(num):   #파라미터보다 같거나 큰 숫자는 제네레이터가 될수 없으므로, 그보다 작은 숫자만을 반복해서 checking
    if sum([int(x) for x in str(i)]+[i]) == num: #제너레이터를 str활용해 simplyfing, self number인지 체크
      return 0
  return num

# 정답확인부분
sum([is_self_number(i) for i in range(1,5000)])

2022/09/24 15:54

최한얼

result=0 ; real_result=0 
x=[]
for i in range(1,5000):
    i_str=str(i)
    i_list=list(i_str)
    for j in i_list:
        result+=int(j)
    real_result=result+i
    real_result_str=(str(real_result))
    x.append(real_result_str)
    #print(real_result)
    result=0 ; real_result=0 
realreal=[]
for i in x:
    x_int=int(i)
    realreal.append(x_int)
#print(realreal)

a=realreal
bb=range(0,5000)
b=list(bb)
b_minus_a=[]
count=0 #검증수
for i in range(0,len(b)):
    count=0
    for j in range(0,len(a)):
        if b[i]==a[j]:
            count+=1
        else:
            pass
    if count==0:
        b_minus_a.append(b[i])

#print(b_minus_a)
result=0
for i in b_minus_a:
    result+=i
print(result)

2023/02/21 15:07

최민우

자력으로 풀었다는 것에 의의를 둡니다...아름답지는 않아요. - 최민우, 2023/02/21 15:08

파이썬으로 구현해 보았어요..

import unittest

def d(n):
    result = 0
    for c in str(n):
        result += int(c)
    result += n
    return result

def sum_of_selfnumber(n):
    total = set()
    found = set()
    for i in range(1, n):
        total.add(i)
        found.add(d(i))
    return sum(total - found)


class MyTest(unittest.TestCase):
    def test1(self):
        self.assertEqual(101, d(91))
        self.assertEqual(101, d(100))

    def test2(self):
        self.assertEquals(1+3+5+7+9, sum_of_selfnumber(10))
        self.assertEquals(1227365, sum_of_selfnumber(5000))

if __name__ == "__main__":
    unittest.main()

2011/08/14 14:40

pahkey

앗. 어려워....머리가 이제 점점 굳어지는.. - 조민영, 2011/08/18 10:08
ㅎㅎ, 저도 이제 다시 풀라고 하면 못풀것 같아요. 이건 예전에 풀어보았던 거라서 ㅋㅋ - pahkey, 2011/08/18 10:09
헉! 이게 뭐하는 짓이야? ㅠㅠ 머리아포...호~~ 해줘....ㅠ,.ㅜ - 한재수, 2011/08/19 18:22
ㅋㅋ, 한번 풀어보세요, 치매예방됩니다. - pahkey, 2011/08/20 11:29
유닛테스트 ㅋㅋㅋㅋㅋㅋ 위키찾아봐야겠당 - 유주성, 2011/10/18 09:48

어제 오늘 일이 잘 안되서 빈둥 거리다 보니.. 하나 더 풀어 봤습니다. ㅡ.ㅡ;
어제도 오랫만에 알고리즘 책을 보다가 잠들었는데, 머리가 아픕니다 ㅠ.ㅠ
그래도 재미있네요.

program Sample;

{$APPTYPE CONSOLE}

function GetGeneratorResult(AIndex:integer):integer;
begin
  Result := AIndex;

  while AIndex > 0 do begin
    Result := Result + AIndex mod 10;
    AIndex := AIndex div 10;
  end;
end;

var
  Loop, Index, Sum : integer;
  HasGenerator : array [1..5000] of boolean;

begin
  FillChar(HasGenerator[1], SizeOf(HasGenerator), 0);

  Sum := 0;
  for Loop := Low(HasGenerator) to High(HasGenerator) do begin
    Index := GetGeneratorResult(Loop);

    // 하나라도 제너레이터가 발견되었는 가?
    if Index <= High(HasGenerator) then HasGenerator[Index] := true;

    // 제너레이터의 결과는 현재 Loop보다 항상 크기 때문에.
    // 아직까지 발견되지 않았으면 계속 없다.
    if not HasGenerator[Loop] then Sum := Sum + Loop;
  end;

  WriteLn('셀프 넘버들의 함 = ', Sum);
  WriteLn;

  Write('Press any key...');
  ReadLn;
end.

2012/01/19 16:14

류종택

델파이 멋져부려요~ ^^ - 오랑캐꽃, 2012/01/19 17:19
델파이 코드는 보면 볼수록 깔끔하군요,, 브레이스 없는것이 파이썬과도 비슷하구요 ^^ 좋은 코드 감사합니다. - pahkey, 2012/01/19 21:37

루비로 풀어 봅니다.

def d(n)
  res = n
  split_n = n.to_s.split ""
  split_n.each { |e| res = res + e.to_i }
  res
end

def sum(arr)
  res = 0
  arr.each {|e| res = res + e}
  res
end

range_arr = (1...5000).to_a

for i in 1...5000
  dn = d(i)
  range_arr.delete dn if dn < 5000
end

puts "result = #{sum(range_arr)}"

2012/03/20 15:57

초보개발자

깔끔한 루비코드군요 ^^ - pahkey, 2012/03/20 18:04

아직 파이썬 배운지 얼마 안되서 별로 않좋은 코드를 짠것 같지만...많은 지적 부탁드립니다.

#NexonQuiz.py
#1부터 5000이하의 수중 generator가 없는 수들의 총합은?
import time
a=time.time()
genList=[]
for i in range(1,5000):
    genNumber=i
    for j in range(0,len(str(i))):
        genNumber+=int(str(i)[j])
    if (not genNumber in genList) and genNumber <=5000:
        genList.append(genNumber)

genSum=0
for j in range(1,5000):
    if not j in genList:
        genSum+=j

print('답은 {0} !!'.format(genSum))
print('걸린시간 : {0} 초'.format(time.time()-a))

코드에서 지적할 점이나 조언해주실 점 있으면 정말 감사하겠습니다ㅎ아직 초보라서..
읽어주셔서 감사합니다!ㅎ

2012/05/30 21:12

Kang Joon Ku

#include <iostream>
using namespace std;

bool check[5000];

void setD(int i)
{
    while(true)
    {
        int idx = i;
        int tmp = i;
        while(tmp)
        {
            idx+= tmp%10;
            tmp/=10;
        }
        if(idx < 5000 && check[idx]) check[idx] = false;
        else break;
    }
}
int main()
{
    fill_n(check,5000,true);
    for(int i=1;i<5000;i++) setD(i); //d(n) > n 이므로 5000까지만 체크해도 된다.
    long long sum=0;
    for(int i=1;i<5000;i++)
        if(check[i] == true)
            sum+=i;
    cout<<sum<<endl;
    return 0;
}

C스타일로 짜본 C++코드입니다. 재밌네요...!>

2013/05/19 22:08

Yoo Taekwon

public class Main 
{
    public static final int MAX_COUNT=5000;
  public static void main(String[] args)
  {
    HashMap<Integer, Boolean> selfNumCheckMap = getSelfNumCheckMap(MAX_COUNT);
    int selfNumSumValue = getSelfNumSum(selfNumCheckMap);
    System.out.println("Sum of self number is " + selfNumSumValue);
  } //void main

  public static HashMap<Integer, Boolean> getSelfNumCheckMap(int maxNum)
  {
    HashMap<Intger, Boolean selfNumCheckMap=new HashMap<Intger, Boolean>();
    for(int i=0; i<maxNum; i++)
    {
      selfNumCheckMap.put(generateNum(i), true);
    } //for i
    return selfNumCheckMap;
  } //HashMap getSelfNumCheckMap

  public static int generateNum(int num)
  {
    int generatedNum = num;
    while(num>10)
    {
      generatedNum += num % 10;
      num = (int)num/10;
    } //while
    generatedNum += num;

    return generatedNum;
  } //int generateNum

  public static int getSelfNumSum(Map<Integer, Boolean> selfNumCheckMap)
  {
    int sumValue = 0;
    for(int i=0; i<MAX_COUNT; i++)
    {
      if(null == selfNumCheckMap.get(i))
      {
        sumValue+=i;
      } //if
    } //for i
    return sumValue;
  } //int getSelfNumSum
} //class Main

자바로 짰습니다. 피씨방이라서 돌려보지는 못했어요... 아흑...

2013/07/25 11:26

Lee JaeYong

def g n
  t = n 
  n.to_s.chars do |c| 
    t += c.to_i
  end
  t
end

not_selfs = []
total = 0

(1..5000).each do |n|
  not_selfs << (g n)
  total += n unless not_selfs.include? n
end

puts "total : #{total}"

2013/09/13 18:35

shoebill

재귀함수로 작성해 보았습니다.

#include<stdio.h>
#define _LENGTH 5000

int d(int num, int origin){
    if(num == 0)
        return num;
    else 
        return (origin == 0 ? num : 0) + num % 10 + d(num / 10, 1);
}

int main(){
    int arr[_LENGTH];
    int i, temp, res = 0;
    for(i = 0; i < _LENGTH; i++)
        arr[i] = 0;
    for(i = 0;(temp = d(i, 0)) < _LENGTH; i++)
        arr[temp] = 1;
    for(i = 0; i < _LENGTH; i++)
        res += arr[i] == 0 ? i : 0;
    printf("res : %d\n", res);
    return 0;
}

2013/10/01 21:21

Lee Ju-won

..

#include <stdio.h>

unsigned int qz_getNumberOfDigits(unsigned int _n)
{
    unsigned int digits = 0;
    unsigned int n = _n;

    while(n != 0)
    {
        digits++;
        n = n / 10;
    }

    return digits;
}

unsigned int qz_computeFnD(unsigned int _n, unsigned int _digits)
{
    unsigned int digits;
    unsigned int retVal;
    unsigned int remainder;
    unsigned int divisor;
    unsigned int i;

    if(_digits == 0)
        digits = qz_getNumberOfDigits(_n);
    else
        digits = _digits;

    retVal = _n;
    remainder = _n;
    divisor = 1;
    for(i = 1; i < digits; i++)
        divisor *= 10;
    while(digits != 0)
    {
        retVal += (remainder / divisor);
        remainder = remainder % divisor;
        divisor /= 10;
        digits--;
    }

    return retVal;
}

unsigned int qz_isSelfNumber(unsigned int _n)
{
    unsigned int retVal;
    unsigned int digits;
    unsigned int i;
    unsigned int min;
    unsigned int max;
    unsigned int fnD_N;

    if(_n <= 31)
    {
        switch(_n)
        {
            case 1: case 3: case 5: case 7:
            case 9: case 20: case 31:
                retVal = 1; /* self number */
                break;
            default :
                retVal = 0;
                break;
        }

        return retVal;
    }

    retVal = 1;
    digits = qz_getNumberOfDigits(_n);
    min = _n - (9 * digits);
    max = _n -1;

    for(i = min; i <= max; i++)
    {
        fnD_N = qz_computeFnD(i, 0);

        if(fnD_N == _n)
        {
            retVal = 0;
            break;
        }

        if(fnD_N + 10 < i)
            i += 4;
    }

    return retVal;
}

unsigned int qz_getSumOfSelfNumbers(unsigned int _from,
        unsigned int _to)
{
    unsigned int sum = 0;
    unsigned int i;
    unsigned int digits;

    sum = ((_from + _to) * ((_to + 1) - _from)) >> 1;
    digits = qz_getNumberOfDigits(_to);

    for(i = _from; i < _to; i++)
    {
        if(qz_isSelfNumber(i) == 0)
            sum -= i;
    }

    return sum;
}

int main(void)
{
    unsigned int from;
    unsigned int to;
    unsigned int result;

    while(1)
    {
        printf("From: \n");
        while(scanf("%u", &from) != 1)
        {
            scanf("%*c");
            continue;
        }
        printf("To: \n");
        while(scanf("%u", &to) != 1)
        {
            scanf("%*c");
            continue;
        }
        result = qz_getSumOfSelfNumbers(from, to);
        printf("Result (%u-%u): %u \n", from, to, result);
    }

    return 0;
}

2013/11/27 18:54

정병관

Javascript로 풀어 봤습니다.

function checkGen(n) {
  var sum = n;
  while(n>0) {
    sum += n - parseInt(n/10)*10;
    n = parseInt(n/10);
  }

  return sum;
}


var isSelfNo = new Array(5000);
var r = 0;
var i = 0;
while(r <= 5000) {
  isSelfNo[r] = 1;
  r = checkGen(++i);
}

var sum = 0;
for(i=0; i<5000; i++) {
  if( !isSelfNo[i] ) sum += i;
}

console.log(sum);

2013/12/16 11:57

Lee Myoung-kyu

PHP 날코딩 해봤습니다.

<?php

    /********************************************************************************
    [문제] 

    어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.
    *********************************************************************************/

    $limit = 4999;
    $total = 0;

    for ( $i=1; $i <= $limit; $i++ ) {
        $gen = false;
        for ( $j=1 ; $j < $i; $j++ ) {

            //
            $row = (string)$j;
            $rowsum = 0;
            for ( $k=0; $k < strlen($row); $k++ ) {
                $rowsum += (int)$row[$k];
            }
            $sum = $j + (int)$rowsum;
            if ( $sum == $i ) {
                $gen = true;
                break;
            }
        }
        if ( !$gen ) {
            $total += $i;
            echo $i."<br/>";
        }
    }
    echo "total : ".$total;

    ?>

2013/12/22 18:08

김만기

Haskell 버전 갑니다.

#!/usr/bin/env runhaskell

import Data.List(nub, (\\))

-- generator를 받아서 결과로 변환 합니다.
transform :: Int -> Int
transform x = (sum . splitDigit) x + x

-- 123 -> [1, 2, 3]
splitDigit :: Int -> [Int]
splitDigit x = reverse .              -- [1, 2, 3]
               map (`mod` 10) .       -- [3, 2, 1]
               takeWhile (> 0) .      -- [123, 12, 1]
               iterate (`div` 10) $ x -- [123, 12, 1, 0, 0 ... ]

main = print $ sum $ [1..4999] \\ itsNotSelfNumber    -- [1, 2, 3] \\ [1, 2] == [3]
       -- 5000 미만의 generator 목록
       where itsNotSelfNumber = nub .                 -- 중복된 숫자를 제거
                                takeWhile (< 5000) .  -- [2, 4, 6 .. 4998]
                                map transform $ [1..] -- [2, 4, 6 ... ]
$ ./selfnumber.hs
1227365
$ 

2013/12/23 08:52

마잇

저도 어찌어찌 한참 헤매다 겨우 1227365 나왔네요.

# coding=utf-8
# Python 2.7.3에서 실행 확인 했음

def d(gen):
    a=[0,0,0,0,gen]
    n=0
    while gen>=1:
        a[n]=gen%10
        gen=gen/10
        n+=1
    return a
y=range(1,5000)
for x in range(1,5000):
    z=sum(d(x))
    if z<5000:
        y[z-1]=0
print sum(y)

2014/01/03 00:10

최동희

저도 해봤네요 코드이그나이터로 짰구요.

<?
class Code extends CI_Controller {

    /*
        어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.
     */

     function d($number){
        $data = array();
        //자릿수
        $cnt = strlen($number);
        for($i=1;$i<=$cnt;$i++){
            $data[$number][$i] = substr($number,$i-1,1);
        }
        unset($cnt);

        $tot = $number;
        foreach($data[$number] as $key => $val){
            $tot += $val;
        }
        return $tot;
     }

     function self_sum(){
        $data = array();
        for($i=1;$i<5000;$i++){
            $data[$this->d($i)] = true;
        }

        /*echo "<pre>";
        print_r($data);
        echo "</pre>";*/ 

        for($i=1,$tot='';$i<5000;$i++){
            if(!isset($data[$i]))
             $tot += $i;
        }

        echo $tot;


     }

}

//출력결과 1227365

2014/01/07 12:58

이 양석

C#입니다

var arr = Enumerable.Range(0, 5000).Select(x => x.ToString().Select( z => Int32.Parse(z.ToString())).Concat(new [] { x }).Sum()).ToArray<int>();

var result = Enumerable.Range(0, 5000).Select(x => (arr.Where(y => x == y).Select(y => y).Count() == 0) ? x : 0 ).Sum();

Console.WriteLine(result);

2014/01/15 12:15

Yun Seok-ju

MATLAB 도 괜찮은가요?

index=1:4999;
for i=1:4999
    i_4=(i-rem(i,1000))/1000;
    i_3=(i-rem(i,100))/100-i_4*10;
    i_2=(i-rem(i,10))/10-i_3*10-i_4*100;
    i_1=i-i_2*10-i_3*100-i_4*1000;
    compared(i)=i+i_1+i_2+i_3+i_4;
    index(compared(i))=0;
end
sol=sum(index);

sol = 1227365

2014/02/04 23:42

태평천하

scala 로 풀어봤습니다.

object SelfNumber {

  def gen(number: Int): Int = {
    (number % 10) + (if (number >= 10) gen(number / 10) else 0)
  }

  def generation(number: Int): Int = {
    number + gen(number)
  }

  def main(args: Array[String]) {
    var haveGenNumber = (1 until 5001).foldLeft(List[Int]())( (b,a) => b :+ generation(a))
    println((1 to 5000).toList.filterNot(haveGenNumber.contains(_)).sum)
  }
}

2014/02/15 14:49

비연랑 airithjs

Ruby입니다

require 'set'

def gen(n)
    n.to_s.scan(/\d/).map(&:to_i).inject(:+) + n
end

range = 1..5000
s = range.to_set

sum = range.inject(0){|sum, num|
    sum += num if s.include?(num)
    s.delete(gen(num))
    sum
}

puts sum

2014/02/19 01:46

Kim Jaeju

Clojure 코드입니다.

(let [digits         (fn [n] (map #(Character/getNumericValue %) (str n)))
      generate       (fn [n] (apply + n (digits n)))
      generated-set  (set (map generate (range 1 5001)))
      self-numbers   (filter (complement generated-set) (range 1 5001))]
  (reduce + self-numbers))

설명

  1. digits: 수 n의 각 자리 수를 구하는 함수

  2. generate: 제너레이터 함수

  3. generated-set: 1 ~ 5000 의 리스트을 제너레이터로 하여 생성한 값의 집합

  4. self-numbers: 1 ~ 5000 의 리스트에서 generated-set 의 값들을 제외한 리스트

  5. (reduce + self-numbers): self-numbers의 합계

출력값: 1227365

2014/02/19 03:40

박연오

int GetGenData(int nData)
{   
    int nGen = nData;
    do
    {
        nGen += nData%10;
    }
    while(nData/= 10);
    return nGen;        
}
int _tmain(int argc, _TCHAR* argv[])
{
    char chHasGen[5001];
    memset(chHasGen,0,5001);
    for(int iter = 1 ;iter <= 5000 ; iter ++)
    {
        int nGen = GetGenData(iter);
        if(nGen <= 5000)
        {
            chHasGen[nGen] = 1;
        }
    }
    int nResult = 0;
    for(int iter = 1 ;iter <= 5000 ; iter ++)
        if(chHasGen[iter] == 0)
            nResult += iter;
    printf("%d",nResult);
    return 0;
}

2014/02/20 11:53

김 영남


#include <iostream>
using namespace std;

int i, j;
int d(int n, int total)
{
    total += n % 10; //자리수 더해줌.

    //재귀탈출조건
    if(n / 10 == 0)
        return j + total;

    return d(n/10, total);
}
int main(void)
{
    int total = 0;

    for(i = 1 ; i < 5000 ; ++i)
    {
        for(j = 1 ; j <= i ; ++j)
        {
            if( d(j, 0) == i )
                break;
        }

        if(j-1 == i)
            total += i;
    }

    cout << total << endl;
    return 0;
}

2014/02/20 20:11

김경주

최적화가 역시어렵네요 ㅠㅠ - 김경주, 2014/02/20 20:14

자바입니당

package h22_generator_selfnum;
class HelloNexon {
    int d(int n){ //함수 d(제네레이터)
        int dn=n, m;
        for(m=1;n/m!=0;m*=10) dn+=(n/m)%10;
        return dn;
    }
    public static void main(String[] args) {
    HelloNexon h=new HelloNexon();
    int L=5000, i, result=0;
    boolean[] selfnum=new boolean[L+1]; //selfnum[i] : i가 selfnum인지 여부
    for(i=1; i<L; i++) selfnum[i]=true; //selfnum 초기화
    for(i=1; i<L; i++) if(h.d(i)<=L) selfnum[h.d(i)]=false;//제네레이터 가진 숫자 골라내기
    for(i=1; i<L; i++) if(selfnum[i]==true) result+=i; //selfnum 총합
    System.out.println(result);
    }
}

2014/02/21 15:20

Katherine

console.info("selfNumber Start \n1이상이고 5000보다 작은 모든 셀프 넘버들의 합을 구하라");

// 1부터 5000보다 작은 숫자들의 배열을 생성한다.
var selfArray = new Array(4998);
var tot = 0;
for(var i = 1; i < 5000; i++){
selfArray[i] = i;
}

//제너레이터는배열에 gen라고 입력한다.
for(var i = 1; i < 5000; i++){
var genNum = parseInt(i%10) + parseInt((i/10)%10) +parseInt((i/100)%10) + parseInt((i/1000)%10) + i; //제너레이터
if(genNum > 5000) break;
selfArray[genNum] = "gen";  //해당 배열에 gen 이라고 입력
}

//self 넘버의 합계를 더한다.

for(var i=1; i<5000; i++){
if(selfArray[i] != "gen") tot += selfArray[i];
}
console.info(tot);

배열로 풀어봤어요..결과는 1227365 나왔습니다.

2014/02/28 14:34

김세연

Ruby.

(1.upto(5000).to_a - 1.upto(5000).map{|i| i + i.to_s.scan(/./).map(&:to_i).reduce(&:+) }).reduce(&:+)

2014/02/28 17:33

nacyot

n.seq=1:4999
generate=function(n){
  len=nchar(n)
  sub.n=vector()
  for(i in seq(len)) sub.n[i]=as.integer(substr(n, i, i))  
  return(n+sum(sub.n))
}

generator=sapply(n.seq , generate)
sum(subset(n.seq, !(n.seq %in% generator)))

R로 짜봤습니다 좋은 문제 감사합니다

2014/03/06 17:49

한 성탁

clojure

(defn d [n]
  (->> n
       str
       (map #(Character/getNumericValue %))
       (reduce +)
       (+ n)))



(let [r (range 1 (inc 5000))]
  (reduce + (clojure.set/difference (set r)
                                    (set (map d r)))))

2014/03/23 08:50

김 은평

def d(g):
    sum = g
    while g>0:
        quotient,remain = divmod(g, 10)
        g = quotient
        sum = sum + remain
    return sum

s = set(range(1,5000))

for i in range(1, 5000):
    v = d(i)
    if v >= 5000:
        break
    if v in s:
        s.remove(v)

print(sum(s))

이미 위에 간결한 코드들이 있지만 학습 중이므로 ^^;

2014/03/25 13:24

Mun Kyeongsam

gen=[]
self=[]
for i in range(1, 5001):
    j = str(i)
    j=j.zfill(4)
    gen.append(int(j[0])+int(j[1])+int(j[2])+int(j[3])+int(j))

for i in range(1, 5001):
    if gen.count(i)==0:
        self.append(i)

print sum(self)

파이썬입니다.

1부터 5000사이의 self넘버들은 gen(1)~gen(5000)보다 작기 때문에 gen(1)~gen(5000)을 만들고 1~5000중에서 gen에 없는것만 고르기 무식하네요 ㅠㅠㅎ

2014/03/27 20:15

JsWolver

안드로이드...


ArrayList<Integer> list = new ArrayList<Integer>();
    private void test() {
        for(int i=0; i<5000; ++i) {
            String test = String.valueOf(i);
            int sum = i;


            for(int k=0; k<test.length(); ++k) {
                String cut = test.substring(k, k+1);
                sum += Integer.parseInt(cut);
            }

            if(5000 > sum) {
                list.add(sum);
            }
        }

        int sum = 0;
        for(int i=0; i<5000; ++i) {
            if(!list.contains(i)) {
                sum += i;
            }
        }
        Log.v("", "kdw sum:"+sum);
    }

2014/03/27 21:10

김대원

1부터 5000사이의 숫자들을 제네레이터로 하여 셀프넘버가 아닌 Set을 만들고(5000 미만의)
그 Set에 포함되지 않는 숫자들만 더해서 셀프넘버들의 합을 구했습니다.

개념은 쉬운데 예쁘고, 간결하게 짜는 것은 어렵네요ㅠㅠ

package selfnumber;

import java.util.HashSet;

public class SelfNumber {
    private HashSet<Integer> notSelfNumberSet = new HashSet<Integer>();

    public int getSelfNumberSum(int limitNumber) {
        makeNotSelfNumberSet(limitNumber);

        int sum = 0;

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

        return sum;
    }

    private void makeNotSelfNumberSet(int limitNumber) {
        for (int generator = 1; generator <= limitNumber; generator++) {
            int generatedNumber = generate(generator);
            if (generatedNumber < 5000) {
                notSelfNumberSet.add(generatedNumber);
            }
        }
    }

    private int generate(int generator) {
        int generatedNumber = generator;

        do {
            generatedNumber += generator % 10;
            generator /= 10;
        } while (generator > 0);

        return generatedNumber;
    }

}

2014/04/01 16:01

Jaehyun, Park

public class SelfNumber {

    /**
     * 각 숫자 길이를 len 라고 하면, 각 자릿수를 더한 합의 최대값은 9 * len 이다.
     * d(n) = 각 자릿수의 합 + n 이므로, n의 범위는 d(n) - 9 * len <= n <= d(n)
     * 
     * n이 2자리인데, d(n)이 3자리 일수도 있을까? 99 = 9 + 9 + 99 = 117 이런 경우도 상관없다.
     * 왜냐하면, d(n)의 자릿수의 길이가 항상 n의 자릿수의 길이보다 크기 때문이다.
     *
     */

    public static void main(String[] args) {
        SelfNumber sn = new SelfNumber();

        int selfNumberSum = 0;

        for (int dn = 1; dn < 5000; dn++) {
            if (sn.isSelfNumber(dn)) {
                selfNumberSum += dn;
            }
        }

        System.out.println(selfNumberSum);
    }

    public boolean isSelfNumber(int number) {
        boolean isSelf = true;

        int len = Integer.toString(number).length();

        int nStart = number - 9 * len;
        if (nStart <= 1) {
            nStart = 1;
        }

        for (int i = nStart; i < number; i++) {
            int digitSum = digitSum(i);
            int dn = digitSum + i;
            if (dn == number) {
                return false;
            }

        }

        return isSelf;
    }

    private int digitSum(int num) {
        String str = Integer.toString(num);
        int sum = 0;

        for (int i = 0; i < str.length(); i++) {
            sum += Integer.parseInt(str.substring(i, i + 1));
        }

        return sum;
    }

}

2014/04/25 00:12

Park JooYong

class ABCD:
    generator=list(range(0,5000))
    def d(self, i):
        i=str(i)
        j=0
        j+=int(i)
        for k in i:
            j+=int(k)
        return j


def main():
    abcd=ABCD()
    for i in range(0,5000):
        j=abcd.d(i)
        if j == i :
            continue
        else :
            try:
                abcd.generator.remove(j)
            except:
                pass
    print(abcd.generator)
    sumGnrt=0
    for sum in abcd.generator:
        sumGnrt+=sum
    print("셀프 넘버의 합 :",sumGnrt)

main()

다른사람에 비해서 좀 지저분해보이네요 ㅠㅠ

2014/05/05 15:28

고 윤호


def d(num2):
    result=num2
    for i in str(num2):
        result = result + int(i)
    return result 

gene=[]
for i in range(1,5001):
    gene.append(i)

for i in range(1,5001):    
    if d(i) in gene:
        gene.remove(d(i))

print sum(gene), gene

2014/05/20 11:30

Jaewon Kim

잠깐 생각해서 만들어 봤습니다... 파이썬이구요

def d(n):
    a = str(n)
    for x in a : n += int(x)
    return n

print sum(set([x for x in range(1,5001,1)]) - set([d(x) for x in range(1,5001,1)]))

처음 올려봤는데 나름 재밌네요^^

2014/06/01 11:51

Lee JuneSeok

python 2.7.3 으로 작성하였습니다. 먼저 1부터 5000까지 list를 만들고 gernerating 하여 나오는 숫자를 하나씩 제거합니다. 최소 1+5000=5001이므로 5000번의 loop만 돌리면되고, loop 이후 남는 숫자들이 selfNumber가 되므로 마지막에 sum 만 해주면됩니다. 답은 1227365

selfNum = [i for i in range(5001)]

for i in range(1, 5001) :
    sum = i
    temp = list(str(i))
    for j in temp :
        sum += int(j)

    if sum in selfNum :
        selfNum.remove(sum)

answer = 0
for i in selfNum :
    answer += i

print answer

2014/06/05 14:31

suker

파이썬 3.2.5 기준입니다.

def d(n):
    L1 = list(str(n))
    return sum([int(N) for N in L1]) + n
L = [n for n in range(5001)]
for n in range(5001):
    if n == d(n):
        continue
    if d(n) in L:
        L.remove(d(n))

print(sum(L))

2014/06/07 01:55

김호은

//유니티 C#으로 도전해봤어요. 실력이 워낙 없어서 좀 지저분합니다. ^^ 의지의 한국인 정도로 생각해주세요~

using UnityEngine;
using System.Collections;

public class NexonQuiz {

    // Use this for initialization
    void Start () {
        int[] array = new int[5000];
        for(int i = 1; i < 5000; i++){
            int gene = getGenerator(i);
            if( gene < 5000 )
                array[gene] = gene;
        }

        int sum = 0;
        for(int i = 1; i < 5000; i++){
            if( array[i] == 0 )
                sum += i;
        }

        Debug.Log( sum ); // 정답: 1227365
    }

        //제너레이터 구하기
    private int getGenerator(int integer){
        int chpher = getCipher(integer);
        int[] array = new int[chpher];

        int nTemp = integer;
        for(int i = 0; i < chpher; i++){
            array[i] = nTemp % 10;
            nTemp = nTemp / 10;
        }
        int sum = 0;
        for(int i = 0; i < chpher; i++){
            sum += array[i];
        }

        return sum + integer;
    }

        //자릿수 구하기
    private int getCipher(int integer){
        int count = 0;
        int nCheck = 1;
        while( integer / nCheck > 0 ){
            nCheck *= 10;
            count ++;
        }

        return count;
    }
}

2014/06/15 04:07

고 형민

회사에서 빈둥빈둥하다 최근에 배우고 있는 swift로 작성해보았습니다.

var generatorArray:Array<Int> = [];

// 제너레이터 판별하는 함수
func hasGeneratorNumber(number:Int) -> Bool {
    if find(generatorArray, number) {
        return true
    }
    return false
}
// 제너레이터 만드는 함수
func makeGeneratorNumber(number:Int)-> Int {
    var tmpNumber = number
    var result = 0
    // 각 자릿수 숫자들의 합을 구합니다.
    do {
        result += tmpNumber % 10
        tmpNumber /= 10
    } while tmpNumber != 0
    // 자신을 더하여 최종적인 제너레이터를 얻습니다.
    result += number

    return result;
}


var result:Int = 0;
for i in 1..5001 {
    //현재 숫자가 제너레이터가 없다면 셀프 넘버이다.
    if !hasGeneratorNumber(i) {
        result += i;
    }
    // 제너레이터 숫자를 생성합니다.
    let generatorNumber:Int = makeGeneratorNumber(i)
    // 제너레이터 숫자가 존재하지 않는다면 제너레이터 배열에 추가합니다.
    if !hasGeneratorNumber(generatorNumber) {
        generatorArray.append(generatorNumber);
    }
}

println("Result : " + result)

2014/06/16 15:42

Ahn Jung Min

파이썬 공부한지 얼마 안되서 기본 문법을 공부하면서 작성해보았습니다. 다른 분들하신거에 비해 많이 부족하네요. 파이썬 공부 얼마 안하신 분들이 참고하시면 좋을 거 같습니다.

Python 2.6.6

max_range = 5000

def d(n):
    n_total = n 
    for i in str(n):
        n_total += int(i)
    return n_total

def main():
    sel_num_total = 0 
    sel_num_list = []

    for n in range(1,max_range):
        sel_num_list.append(d(n))

    for n in range(1,max_range):
        if not n in sel_num_list:
            sel_num_total += n

    print "Total: "+str(sel_num_total)

if __name__ == "__main__":
    main()

2014/06/18 16:30

양승은

PHP 입니다.

function print5($init=1, $limit=4999) {
    $arr = range($init, $limit);
    foreach ($arr as $n) {
        $arr_gen[$n] = $this->d($n);
    }
    $arr_sum = array_sum(array_unique(array_diff($arr,$arr_gen)));  /* 합(중복제거(셀프넘버만 남기기)) */
    echo $arr_sum;
}
function d($n) {
    $d_val = $n;
    $len = strlen($n);
    for($i=0;$i<$len;$i++) {
        $tmp_n = substr($n,$i,1);
        $d_val += $tmp_n;
    }
    return $d_val;
}

1227365 나오네요

다른 분들 풀이를 보다보니, 파이썬을 공부해봐야겠다는 생각이 꿈틀꿈틀하네요. :)

2014/06/18 17:23

안경쓴루피

C++11 입니다.

#include <iostream>
#include <set>
#include <numeric>

class SelfNumbersIn
{
public:
  SelfNumbersIn(const int& range) {
    for (int i = 1; i < range; ++i) numbers_.insert(i);
    for (int i = 1; i < range; ++i) numbers_.erase(d(i));
  }
  int Sum() const {
    return std::accumulate(numbers_.begin(), numbers_.end(), 0);
  }
private:
  int d(int n) {
    int sum = n;
    while(n > 0) {
    sum +=  n % 10;
    n = n / 10;
    }
    return sum;
  }
  std::set<int> numbers_;
};

int main()
{
  std::cout << SelfNumbersIn(5000).Sum() << std::endl;
  return 0;
}

$ g++ generator_c11.cpp -std=c++11 && ./a.out
1227365

2014/07/01 15:14

Park Minwoo

  1 #!/usr/bin/env python
  2 #-*- encoding:utf-8 -*-
  3 def check(num):
  4     base = num
  5     while 1:
  6         total = 0
  7         number = str(num)
  8         lenth = len(number)
  9
 10         for i in range(lenth):
 11             total = total + int(number[i])
 12         total = total + num
 13         if total == base:
 14             return 0 #셀프 넘버가 아닌것들은 0으로 리컨
 15         num = num - 1
 16         if num == 0:
 17             return base #self number 인 값을 리턴
 18
 19
 20 result = 0
 21 for i in range(1,5001):
 22     result = result + check(i)
 23 print result

python 2.7.2 기준입니다.

출력 결과 :

My_home$ python self_number.py

1227365

===============================================================

간단한 설명

:- 일단 속도는 빠르지는 않습니다. ( 좋은 코딩이라고 보기는 어려울것 같습니다. )

:- 숫자를 넣었을때 일단 ex) 112 -> 1+1+2 + 112 가 112인지 체크 합니다. 아니라면 , 다음스텝에 1줄여서 111로......이런식으로

:- 값이 매칭이되면 0리턴, 셀프 넘버면 셀프 넘버값 리턴

:- 반복문으로 호출하며 값을 더해줍니다.

:- 끝

2014/07/02 11:14

naig

c언어로 짜보았습니다.

#include <stdio.h>
#define MAX 5000
int Return_Generator(int number);
typedef enum {false, true} bool;


int main()
{
    // 1차원 배열로 인덱스+1 = N,  배열의 값이 false이면 셀프넘버.  배열의 값이 true이면 제네리이터라고 한다
    int CheckGen[MAX];
    int i;
    int Gen_index=0;
    int sum=0;

    // 배열 초기화
    for(i=1; i < MAX; i++)
    {
        CheckGen[i]=false;
    }


    for(i=1; i < MAX; i++)
    {
        Gen_index=Return_Generator(i);
        if(Gen_index < MAX)  // 5000을 넘는 값은 문제의 범위를 넘어가기 때문에 알 필요가 없다.
        {
            CheckGen[Gen_index-1]=true;
        }
    }

    for (i=0; i < MAX; i++)
    {
        if(CheckGen[i]==false)
        {
         //   printf("%d  ", i+1);
            sum = sum+ (i+1);
        }
    } 
    printf("Sum= %d\n",sum);


}

// d(n)값을 리턴한다.
int Return_Generator(int number)
{
    int Return_Value=0;
    int TargetNumber=0;
    int LastNumber=0;

    TargetNumber=number;

    while(TargetNumber > 0)
    {
        LastNumber = TargetNumber % 10;
        TargetNumber=TargetNumber /10;
        if(TargetNumber == 0)
        {
            return Return_Value += LastNumber + number;
                // 마지막에 최고 자릿수의 넘버와, 자기자신을 더하고 리턴시킨다.
        }else{
            Return_Value += LastNumber;
        }
    }
}

2014/07/06 21:37

Park Jun Seong

def cal_generator(num):
    result = 0
    tmp = str(num)
    for item in tmp:
        result = result + int(item)
    result = result + num
    return result

sample = range(1,5000)
temp_list = []

for item in sample:
    tmp = cal_generator(item)
    if tmp in range(1,5000):
        temp_list.append(tmp)

temp_list.sort()
result = 0

for item in range(1,5000):
    if item not in temp_list:
        result = result + item

print result

2014/07/23 18:03

하태욱

scala로 풀어봤습니다.

scala> (1 until 5000).filterNot( (1 until 5000).map( (m:Int)=>m+m.toString.map(_.asDigit).sum ).toSet ).sum
res4: Int = 1227365

2014/07/25 12:14

goodgene

#include <stdio.h>

#define TRUE 1
#define FALSE 0

int IsSelfNumber( int num )
{
    int i, temp, self_sum;

    for( i = 1; i < num; i++ )
    {
        temp = i;
        self_sum = 0;

        while( temp > 0 )
        {
            self_sum += temp % 10;
            temp /= 10;
        }

        if(( self_sum + i ) == num )
        {
            return FALSE;
        }
    }

    printf("%d is Selfnumber \r\n", num );
    return TRUE;
}

void main()
{
    int i, sum;

    sum = 0;

    for( i = 1; i < 5000; i++)
    {
        if( IsSelfNumber(i) == TRUE )
            sum += i;
    }

    printf("sum : %d\r\n", sum );
}

2014/07/30 14:03

변민호

Python 열공할려고 처음으로 만들어봤어요. v3.4.1


def generator(inputnum):
    return inputnum + sum([int(i) for i in str(inputnum)])


targetnums = range(1,5001)
print (sum(set(targetnums) - set(map(generator, targetnums))))

2014/07/31 16:42

inking007

저도.. python3.3.2 입니다.

print(sum(set(range(1,5001))-set(map(lambda n:sum(map(int, str(n)))+n, range(1,5001)))))

근데 짧은게 정답만은 아닌듯;

2014/08/04 10:18

안 준환

def d(n):
    nn = str(n)
    sum = n
    for s in nn:
        sum += int(s)
    return sum

def dset(i, j):
    result = set()
    for x in range(i, j):
        result.add(d(x))
    return result

print(sum(set(range(1, 5000)) - dset(1, 5000)))

파이썬 공부하는 중입니다.

2014/08/08 17:51

앱솔룰리

public class generator {

    private static int d(int num) {
        int x1 = num % 10;
        int x10 = (num / 10) % 10;
        int x100 = (num / 100) % 10;
        int x1000 = num / 1000;

        return num + x1 + x10 + x100 + x1000;
    }

    public static void main(String[] args) {

        int sum = 0;

        outer: for (int i = 1; i < 5000; i++) {
            for (int j = 1; j < i; j++) {
                if (i == d(j)) {
                    continue outer;
                }
            }
            sum += i;
        }
        System.out.println(sum);
    }
}

자바입니다.

2014/08/14 14:07

박 대성

코딩배운지 이제 1년 반 다되가는 고등학생입니다. 이제 c와 c++, 자바를 조금 할 수 있는데.. 여기 와 보니 전 우물안의 개구리였군요 ㅠㅠ 더 열심히 배우도록 하겠습니다!

노란띠 되려고 풀이 같지도 않은 풀이를 작성하네요 양해바랍니다.

코드:

#include <iostream>
#include <vector>

using namespace std;

int getGenerator(int);

void main() {

    vector<int> selfNumbers;
    int normalSum = 0;
    int generatorSum = 0;

    for(int i = 1; i < 5001; i++) {
        normalSum += i;

        int generator = getGenerator(i);
        bool overlap = false;
        for(int j = 0; j < selfNumbers.size(); j++)
        {
            if(selfNumbers[j] == generator)
            {
                overlap = true;
                break;
            }
        }

        if(!overlap && generator <= 5000) {
            selfNumbers.push_back(generator);
            generatorSum += generator;
        }
    }

    cout<<normalSum-generatorSum<<endl;
}

int getGenerator(int n)
{
    int sum = n;

    while(true) {
        sum += n % 10;
        n /= 10;
        if(n == 0)
            break;
    }

    return sum;
}

출력값 :

1227365

이렇게 짜 두었습니다. 방학이라 오랜만에 코딩하니 어렵네요.. 노가다 방식으로 무식하고 무난(?)하게

(1부터 5000까지 자연수 합) - (1부터 5000까지 제너레이터 합) = (1부터 5000까지 셀프넘버 합)

이렇게 구했네요.

이제부터 코드를 효율적으로 짜는 방법을 익혀야죠!! 화이팅!

2014/08/16 11:51

Choi SeHyun

#include <iostream>
using namespace std;

#define MAX 5000

int tempArr[MAX];

int calcNum(int a)
{
    int sum = a;
    while (a != 0)
    {
        sum += a % 10;
        a /= 10;
    }
    return sum;
}

bool checkSelfNum(int num)
{
    for (int j = 0; j < MAX; j++)
    {
        if (tempArr[j] == num)
        {
            return false; //셀프넘버x
        }
    }
    return true;//셀프넘버  
}

void init()
{
    int tmp = 0;
    for (int i = 0; i < MAX; i++)
    {
        tmp = calcNum(i);
        tempArr[i] = tmp;
    }
}

int main()
{
    init();

    int res = 0;

    for (int i = 0; i < MAX; i++)
    {
        if (checkSelfNum(i))
        {
            //cout << "self Number -> " << i << endl;
            res += i;
        }
    }
    cout << res << endl;
    return 0;
}

c++ 로 했구요 ... 속도가 느리네요.. 50000만 되도..;;ㅠ

2014/08/20 01:37

def d(n):
    val = n
    for i in str(n):
        val += int(i)
    return val

def gen(x):
    generator = [x for x in range(1,x)]
    for i in range(1,x):
        val = d(i)
        if val in generator:
            generator.remove(val)
    return sum(generator)

print (gen(5000))

2014/08/26 17:50

superarchi

// java

> // System.out.println(selfNumberSum(5000));
    public static int selfNumberSum(int n) {
        int[] memo = new int[n];
        for(int i=1; i<n; i++)
            saveDn(memo, i, n);

        int sum = 0;
        for(int i=1; i<n; i++)
            if(memo[i] == 0)
                sum += i;

        return sum;
    }

    private static void saveDn(int[] tab, int i, int n) {
        int dn = i + sumDigits(i);
        if(dn < n)
            tab[dn] = 1;
    }

    private static int sumDigits(int n) {
        return n==0 ? 0 : n%10 + sumDigits(n/10);
    }

2014/08/27 17:20

msk

result : 1227365

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;


public class GeneratorTest {
    /** 
     * 
     * 어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.
     * d(91) = 9 + 1 + 91 = 101
     * 이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.
     * 제네레이터가 없는 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다.
     * 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.
     * 1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.
     * 
     */
    private final static int MAX_NUM = 4999;


    public static void main(String[] args) {


        Set<Integer> noSelfNum = getNoSelfNum(MAX_NUM); //셀프넘버가 아닌 숫자 셋.        

        int result = getSum(MAX_NUM) ;  // 1부터 4999까지의 합

        Iterator<Integer> noSelfNumIter = noSelfNum.iterator();
        while(noSelfNumIter.hasNext()) {    // 뺍니다.
            result -= noSelfNumIter.next();
        }

        System.out.println("result : " + result);
    }

    public static Set<Integer> getNoSelfNum(int maxNum) {
        Set<Integer> noSelfNum = new HashSet<Integer>();
        int num;
        for(int i = 1; i <= maxNum; i++) {
            //ex)1342 -> 1+3+4+2+1342 = 1352. 
            num =  i; //1342
            num += i % 10; //1342 % 10 = 2
            num += (i/10) % 10; // 134 % 10 = 4
            num += (i/100) % 10;    // 13 % 10 = 3
            num += i/1000;  //1         

            if(num > maxNum) continue;

            noSelfNum.add(num);

        }
        return noSelfNum;
    }

    public static int getSum(int maxNum) {
        if(maxNum%2 == 0) return (1+maxNum) * (maxNum/2);
        return (1+maxNum) * (maxNum/2) + (maxNum/2+1); 
    }
}

2014/08/29 19:43

Jo Ara

def d(n)
  n[0].to_i + n[1].to_i + n[2].to_i + n[3].to_i + n.to_i 
end

sum = 0

(1..5000).each do |i|
  true_check = false
  (1..i).each do |ii|
    true_check = true if d(ii.to_s) == i 
  end
  sum = sum + i unless true_check
end
puts sum

일단 답을 빨리 찾자고 생각하고 코딩한건데.. 다른 분들 보니까 진짜 내공이 장난아니군요.. 많이 배워갑니다!

2014/09/11 15:02

Park Sangjin

Delphi

var
  boolArrary: Array of Boolean;
  n,nLength,dn,divNumber,sumSelfNum:Integer;
begin
  SetLength(boolArrary,5000); 
  try
    { TODO -oUser -cConsole Main : Insert code here }
    dn := 0;
    for n := 1 to 5000 do
    begin
      for nLength := 1 to Length(IntToStr(n)) do
      begin
        divNumber := StrToInt(Copy(IntToStr(n),nLength,1)); 
        dn := dn + divNumber;
        if nLength = Length(IntToStr(n)) then
          dn := dn + n; 
      end;
      if dn <= 5000 then
        boolArrary[dn] := True; 
      dn := 0;
    end;
    sumSelfNum := 0;
    for n := 1 to 5000 do     
      if not (boolArrary[n]) then
        sumSelfNum := sumSelfNum + n;
    Writeln('1 ~ 5000 사이의 self number 합');
    Writeln('SumSelfNum = ' + IntToStr(sumSelfNum));
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

2014/09/19 14:55

Jo Jae Hoon

def gen(num):
    result = num
    for x in str(num):
        result = result + int(x)
    return result

gen_result = set()

for x in range (1,5000):
    result = gen(x)
    gen_result.add(result)

self_set = set(range(1,5000))-gen_result
print(sum(self_set))

2014/09/19 21:47

돌구늬ㅋ~썬

JAVA로 풀어봤습니다.

public static int generate_number(int x){
    int num=x, sum=x;
    while(true){
        if(num==0) break;
        sum+=num%10;
        num/=10;
    }

    return sum;
}
public static void main(String[] args) {
    int area=5000, 
        sum=0;
    List generated_numbers=new ArrayList<Integer>();

    for(int i=1;i<area;i++)
        generated_numbers.add(generate_number(i));

    for(int i=1;i<area;i++){            
        if(generated_numbers.indexOf(i)==-1)
            sum+=i;
    }       
    System.out.printf("solution is %d.\n",sum);
}

2014/09/22 09:57

Bayahro

여기 오늘 가입했습니다... 그냥 for문으로 노가다ㅠㅠ.....

/*어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.*/

#include "stdafx.h"
#include <iostream>

using namespace std;

int gener (int num);

int _tmain(int argc, _TCHAR* argv[])
{
    int self_num[5001]={0}; //제네레이터가 될때마다 1씩증가
    int i;
    int sum=0;//셀프넘버의 합

    for(i=1;i<5000;i++)
    {

        self_num[gener(i)]+=1;
        //제너레이션이 발생하면 그 자리에 맞는 값이 1씩증가 합니다.
        //gener[4988]=0이면 셀프 넘버
    }

    for(i=1;i<5000;i++)
    {
        if(self_num[i]==0)
        {
            cout<<i<<"  "<<self_num[i]<<endl;
            sum+=i;
        }
    }
    cout<<"1~5000까지의 self_number의 합은 "<<sum<<" 입니다.\n";
    return 0;
}

int gener(int num)
{
    int i=1000;
    int val=num;
    int a=0;

    while(i>0)
    {
        a=num/i;//각 자릿수를 구합니다.
        val+=a;//제너레이션
        num-=a*i;//젤앞의 수부터 차례대로 지웁니다.
        if(val>5000)
        {
            val=0;
            break;
            //만약 제너레이션 값이 5000이상이 나왔으면 0을 출력합니다.
        }
        i=i/10;
    }

    return (val);
}

2014/09/23 20:15

크리보

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var sumOfSelfNumbers = 0;
        var generatedNumbers = new List<int>();

        for (var i = 1; i < 5000; i++)
        {
            if (generatedNumbers.Contains(i) == false)
            {
                sumOfSelfNumbers += i;
            }
            generatedNumbers.Add(d(i));
        }

        Console.WriteLine("sumOfSelfNumbers = " + sumOfSelfNumbers);
    }

    static int d(int number)
    {
        var generate = number;
        var digits = number.ToString().ToCharArray();

        foreach (var aDigit in digits)
        {
            generate += Int32.Parse(aDigit.ToString());
        }

        return generate;
    }
}

2014/09/25 16:40

보헤미안

Java

public static void main(String args[]) {                      

    int[] generator = new int[5000];
    int sumSelfnumber = 0; 

    for (int i = 1; i < 5001; i++) {       // generator가 있는 값
        int temp = i;
    while (temp != 0) {
        item[i - 1] += temp % 10;
        temp = temp / 10;
        if (temp == 0) 
            generator[i - 1] += i;
    }
    }

go: for (int j = 1; j < 5001; j++){        // 1 ~ 5000 중에 generator가 있는 값을 제외하고 모두 더한다
    for (int i = 0; i < 5000; i++)         // (self-number들의 합)     
        if (j == generator[i])               
            continue go;
        total += j;
   }

   System.out.println("1~5000 셀프 넘버들의 합 : " + sumSelfnumber);
}

2014/10/02 12:13

이 동훈

//C로 짰습니다.

#include <stdio.h>
#include <stdlib.h>

int get_Dn(int input);
int filtering_and_Sum(char* _filter, int size);

int main()
{
    int MaxNum, i, result;
    char* filter; //true, false값을 체크하는 array
    printf("자연수를 입력하시오 : ");
    scanf("%d", &MaxNum);
    filter = (char*)malloc(sizeof(char)*MaxNum);
    for (i = 0; i < MaxNum; i++){
        *(filter + i) = 1;
    }

    result = filtering_and_Sum(filter, MaxNum);
    printf("-----------------------------\n\n");
    printf("The Summation of Self_Number is : %d\n", result);

    free(filter);
    return 0;
}

int get_Dn(int input)
{
    int output;
    int divisor=10;
    output = input;
    for (; 10*input/divisor; input /= divisor){
        output += input % divisor;
    }
    return output;
}


int filtering_and_Sum(char* _filter, int size)
{
    int i;
    int sum = 0;
    for (i = 1; i < size+1; i++){
        if (get_Dn(i) <= size)
            _filter[get_Dn(i)-1] = 0; // Self_Num이 아닌 경우 false값 지정
    }
    printf("self_number from 1 to %d...\n", size);
    for (i = 1; i < size+1; i++){
        if (_filter[i-1]){
            printf("%d\n", i);
            sum += i;
        }
    }
    return sum;
}

2014/10/15 23:47

Lee Heetae


// Java

public class SelfNumber {
    private static final int N = 5000;
    private static final int K = 10000;
    private static boolean[] self = new boolean[N];

    public static void main(String[] args) {
        int result = 0;
        for (int i = 0; i < N; i++) {
            result = i + calc(i, K);
            if (result < N) self[result] = true;
        }

        int sum = 0;
        for (int i = 1; i < N; i++) {
            if (self[i] == false) sum += i;
        }

        System.out.println(sum);
    }

    public static int calc(int i, int k) {
        if (k == 10) return (i%k) / (k/10);
        return ((i%k) / (k/10)) + calc(i, k/10);
    }
}

Recursion 사용해봤습니다.

2014/10/29 19:14

마법사

erlang 있나요? OTP 17.3에서 테스트해봤습니다.

sets 안쓴 버전입니다.

-module(generator_sum).
-export([check/1]).

% sum for each digits
s(N) -> N rem 10 + case N < 10 of true -> 0; false -> s(N div 10) end.

check(N) ->
    L = lists:seq(1, N),
    lists:sum([X || X <- L, fun(Y) -> not lists:member(Y, [fun(Y) -> Y + s(Y) end (X) || X <- L]) end(X)]).

sets쓰면...

-module(generator_sum).
-export([check/1]).

% sum for each digits
s(N) -> N rem 10 + case N < 10 of true -> 0; false -> s(N div 10) end.

check(N) ->
    L = lists:seq(1, N),
    lists:sum(sets:to_list(sets:subtract(sets:from_list(L), sets:from_list([fun(Y) -> Y + s(Y) end (X) || X <- L])))).

실행은...

generator_sum:check(5000).

2014/10/30 17:27

ptetq

def d(n):
    dd = str(n)
    nn = 0
    for i in dd:
        nn += int(i)
    return n + nn

ll = []

for i in range(1,5050):
    if d(i) >= 5000:
        pass
    else:
        ll.append(d(i))

answer = sum(list(range(5000))) - sum(list(set(ll)))
print(answer)

2014/11/12 02:56

Song Hoemoon

print( sum(set(range(1,5000)) - {x+sum([int(i) for i in str(x)]) for x in range(1,5000)}) )

2014/11/15 11:24

kong hyunwoo

scala> def d(n: Int): Int = {
     | n + n.toString.map(_.asDigit).sum
     | }
d: (n: Int)Int

scala> def dlist(n: Int): Stream[Int] = d(n) #:: dlist(n + 1)
dlist: (n: Int)Stream[Int]

scala> (1 to 5000) diff dlist(1).takeWhile(_ <= 5000) sum
res8: Int = 1227365

2014/12/04 17:09

killbirds

scala> def d(n: Int): Int = {
     | n + n.toString.map(_.asDigit).sum
     | }
d: (n: Int)Int

scala> def dlist(n: Int): Stream[Int] = d(n) #:: dlist(n + 1)
dlist: (n: Int)Stream[Int]

scala> (1 to 5000) diff dlist(1).takeWhile(_ <= 5000) sum
res8: Int = 1227365

2014/12/04 17:09

killbirds

#include <iostream>

using namespace std;


void main() {
    int const num = 5000;
    int sum = num * (num - 1) / 2;
    int check[num] = { 0, };

    for (int j = num; j != 0; j--) {
        int i = j;
        int g = 0;
        g += i;
        g += i % 10;
        while (i >= 10) {
            i /= 10;
            g += i % 10;
        }
        if (g<num && check[g] == 0) {
            sum -= g;
            check[g] = 1;
        }
    }

    cout << sum << endl;
}

2014/12/06 12:27

I ZG

public class test {

    public static void main(String[] args) {

        boolean[] list = new boolean[5000];
        int x;
        int namuji; //나머지 
        int mok; //몫
        int sum; //제네레이터에 의해 생성된 수
        int i;
        int sum2 = 5000*2499+2500; //총합을 누적하는 변수


        for(i = 0; i<5000; i++)
        {
            list[i] = false;
        }


        for(i = 1; i<5000; i++)
        {
            mok = i; 
            sum = i;

            //제네레이터에 의한 합 구하기
            while(mok>=1)  
            {  
                namuji = mok % 10;   
                mok = mok / 10;
                sum = sum + namuji;
            }  

            //제네레이터에 의해 생성된 수만 list 배열에서 true로 지정하고 누적 합에서 빼기
            if(sum < 5000)
            {
                list[sum] = true;
            }

            if(list[i] == true)
            {
                sum2 = sum2 - i; 
            }
        }

        System.out.println("셀프 넘버의 합은 "+sum2+"입니다.");
    }
}

답은 1227365 입니다.

2014/12/09 14:59

safin

set을 안쓰고 풀어보았습니다.

l = [0] + [1]*(5000-1)
for i in range(1, 5000):
    d = sum((int(x) for x in str(i))) + i
    if d < 5000:
        l[d] = 0
print sum(l)

2014/12/11 14:17

룰루랄라

JavaScript

var i = 0
var arr = new Array(5001).join('0').split('').map(parseInt);
while (1) {
    var j = i++;
    var s = j;
    while(j > 0) {
        s += j - parseInt(j / 10) * 10;
        j = parseInt(j / 10);
    }
    if (s >= 5000) break;
    arr[s] = 1;
}

var r = 0;
arr.forEach(function(e, n) {
  r += e ? 0 : n;
});

console.log(r);

2014/12/14 07:09

Lee DE

#include <iostream>
using namespace std;


bool checkGenerator(int input);// 이숫자가 제네레이터가 있는가
int d(int input); // 제네레이터 값

int main(){

    int result = 0;

    for (int i = 1; i <= 5000; i++)
    {
        if (checkGenerator(i) == false)
        {
            cout << i << endl;
            result += i;
        }
    }

    cout << "result = " << result << endl;
}

int d(int input)
{
    int temp = input;
    int result = 0;
    if (input < 10)
        result += input;
    while (temp >= 10)
    {
        result += temp % 10;
        temp /= 10;
        if (temp < 10)
            result += temp;
    }
//  cout <<"g = "<<input <<" "<< result + input<<" end"<<endl;
    return result + input;
}

bool checkGenerator(int input)
{
    for (int i = 1; i <= input-1; i++)
    {
        if (d(i) == input)
            return true;
    }
    return false;
}

파이썬을 배워봐야겠네요

2014/12/27 15:44

서동주

self_nums = range(1,5001)               #self number의 후보를 리스트로 만듭니다.

for gen in range(1,5001):               #generator는 반드시 generate한 숫자보다 작으니까 있더라도 1-5000중에 있습니다.
    gen_str = str(gen)              #generator의 각 자릿수를 뽑아내기 위해 스트링으로 바꿉니다
    sum_digits = 0                  #자릿수의 합을 초기화합니다.
    for digit in gen_str:               
        sum_digits += int(digit)        #자릿수의 합을 구합니다.
    generated_num = sum_digits + gen        #자릿수의 합과 generator를 더해서 최종 generate된 숫자를 구합니다.
    if generated_num in self_nums:          
        self_nums.remove(generated_num)     #만약에 generate된 숫자가 self number 후보 안에 있다면 그 수를 후보 리스트에서 지웁니다.
                            #이렇게 해서 후보 리스트 안에는 self_number들만 남습니다.
final_sum = 0                       #셀프 넘버 합을 초기화합니다.
for self_num in self_nums:
    final_sum += self_num               #셀프 넘버 합을 구합니다.

print final_sum                     #셀프 넘버 합을 출력합니다.


2014/12/28 19:47

김슈타인

def generate(num):
  return num + sum([int(d) for d in str(num)])

generated = set([generate(n) for n in range(1, 5000)])
all_num = set(range(1, 5000))

print(sum(all_num - generated))

다른 답을 봐버려서 비슷하게 나오네요.. 다음번엔 다른 답 안보고 도전...

2014/12/29 04:04

hwang

Perl

for(1..4999){my$a=$_;my$b=0;for(split(//,$a)){$b+=$_}$c[$a+$b]++;$d+=$a if $c[$a]<1}print$d;

문제에 나왔듯 한 수가 여러 제너레이터를 가질 수 있기 때문에 총합에서 그냥 빼면 다른 값이 나옵니다.

[1,4999]의 정수는 제너레이터를 2개까지 갖는 것만 보입니다.

2014/12/29 20:26

*IDLE*

파이썬은 접해본지 얼마 안되서 잘 모르니 처음엔 이렇게 1~4999까지 값들을 list에 놓고 d(n) 으로 제거해가면서 했습니다.

lst=range(1,5000)

def d(n):
    tot = 0
    for c in str(n):
        tot += int(c)
    tot += n
    return int(tot)

for i in range(1,5000):
    if d(i) in lst:
        lst.remove(d(i))

print lst
print type(lst)
print sum(lst)

2015/01/05 18:02

김 보근

Ruby

puts ((1...5000).to_a - (1...5000).collect { |x| x + x.to_s.split('').map(&:to_i).inject(:+) }).inject(:+)

2015/01/05 22:55

Kim Jitae

Scala

def d(n:Int):Int = if(n == 0) 0 else (n % 10) + d(n / 10)
(1 until 5000).diff(for(i <- 1 until 5000) yield i + d(i)).sum

2015/01/18 09:41

이 호연

python 3.4

답변들이 많아서 먼저 풀어보고 다른 답변들을 보니, 역시나 간결하고 좋은 코드들이 많이 있네요.

generator = []
for i in range(1,5000):
    strNo = str(i)
    sumNo = 0
    for j in range(len(strNo)):
        sumNo = sumNo + int(strNo[j])
    sumNo = sumNo + i
    generator.append(sumNo)
print(sum(set(range(5000))-set(generator)))

2015/01/19 10:14

eunpyo

#include <stdio.h>

int check[5000];

int main()
{
    int sum;
    int i,tmp=0;
    for(i=0;i<5000;i++)
    {
        if(i<9)
        {
            tmp = i+i;

        }
        else if( i<99)
        {
            tmp = i+ (i/10)+(i%10);

        }
        else if(i<999)
            tmp = i+ (i/100)+(i/10)+(i%10);
        else if(i<4999)
            tmp = i+ (i/1000)+(i/10)+(i%10);

        if(tmp <= 5000)
            check[tmp] = 1;

    }
    for(i = 0 ; i < 5000; i++)
    {
        if(check[i]==0)
            sum+=i;
    }
    printf("%d", sum);
}

2015/01/20 09:13

이민형

처음 구할 리스트를 정했습니다.

last_list=[]
new_list=[]
sum=0

그다음 자신의 수와 자신의 개개인의 수를구하는 함수를 만들었습니다.

def get_value(value):
    list=[]
    value2=str(value)
    for i in value2:
         list.append(i)
    value4=0
    for t in list:
        value3=int(t)
        value4=value4+value3
    return value4+value

그럼 5000 까지중에 리스트에 없는 것을 하나씩 구했습니다.

for k in range(5000):
     key=get_value(k)
     if key not in last_list:
            last_list.append(key)

그럼 5000 까지 해서 없는 값을 구하고


for key in range(5000):

     if key not in last_list:
            new_list.append(key)

이제 합을 구합니다.


for i in new_list:
    sum=sum+i
print sum

2015/01/27 11:26

이 승훈

a = set(range(1,5000))
c = set(num+sum(int(a) for a in str(num)) for num in range(1,5000))

print sum(a-c)

2015/01/27 13:47

kangjin13

어차피 제네레이터를 돌리면 자신의 수보다 최소 1은(100같은경우) 더 크므로 제네레이터를 돌리는 수보다 작은 수들중 셀프 넘버를 찾으면 되므로 제네레이터를 돌리면서 자신이 셀프넘버인지 확인.

나올 수 있는 최대 수는 자리수 = n 이라고 하면 9*n + (10^(n+1))-1 이므로 if문 하나 더 넣는것보다 배열 조~금더 주는게 좋다고 생각했습니다.

조언 부탁드립니다 ㅎㅎ;;

int d(int a)
{
    if(a<10)
        return a;
    return a%10+d(a/10);
}
main()
{
    int i,num[5100]={0,},sum=0;
    for(i=1;i<=5000;i++)
    {
        num[d(i)+i]=1;
        if(!num[i])sum+=i;
    }
    printf("%d",sum);
}

2015/01/27 16:28

정기석

저는 재귀함수 쓸 생각을 전혀 못했어요ㅎㅎ 배우고 갑니다~ - 그린구름, 2015/02/24 00:36

def d(n: Int): Int = {
  n + n.toString.map(_.asDigit).sum
}

val generators = (1 to 5000).map(d)
val numbers = 1 to 5000

val result = numbers.diff(generators).sum

스칼라로 풀어봤어요. scala 2.11.5

2015/02/10 21:16

Yang Wonsuk

파이썬으로 풀어 보았습니다. 1~5000까지 모든 숫자에 대한 연산 결과를 hasGen 리스트에 추가한 후, i번째 숫자가 리스트 hasGen에 없으면 total에 누적하여 더하는 방식으로 구했습니다.

hasGen = []
begin=1
end=5000
total=0
for i in range(begin,(end+1)) :
    a1 = int(i/1000)%10
    a2 = int(i/100)%10
    a3 = int(i/10)%10
    a4 = i%10
    result = sum([a1, a2, a3, a4]) + i
    hasGen.append(result)
    if i not in hasGen:
        total += i
print(total)

vegan님의 코드를 참조하여 조금 더 간단히 고쳐 보았습니다.

hasGen = []
begin=1
end=5000
total=0
for i in range(begin,(end+1)) :
    result = i
    for j in str(i): result += int(j)
    hasGen.append(result)
    if i not in hasGen:
        total += i
print(total)

파이썬을 배운지 얼마 되지 않았는데, 여기 와서 강력한 문법에 놀라고 있습니다. 재미있네요:)

2015/02/22 03:06

Shin Kyosoo

JAVA

public class SelfNumber {
    public static void main(String[] args) {

        int maxNum = 5000;
        boolean[] generator = new boolean[maxNum];

        for (int num=1; num<maxNum; num++){
            String str = num+"";
            int tmp = num;
            for (int idx=0; idx<str.length(); idx++){
                tmp += str.charAt(idx)-'0';
            }
            if (tmp >= maxNum) break;
            generator[tmp] = true; 
        }

        int sumSelfNumber = 0;
        for (int i=0; i<maxNum; i++){
            if (!generator[i]){
                sumSelfNumber+=i;
            }
        }
        System.out.println("self-number 총합:"+sumSelfNumber);
    }
}

self-number 총합:1227365

2015/02/24 18:42

그린구름

파이썬 3.4.3으로 작성했습니다.

gen = set(range(5000))
for x in list(gen):
    num=x
    for a in str(x):
        num += int(a)
    try:
        gen.remove(int(num))
    except: None        
print(sum(list(gen)))

2015/03/10 10:16

임 진승

(apply + ;; 최종 합
       (clojure.set/difference ;; 차집합
        (set (range 5000))         ;; 5000 까지 숫자 집합
        (set (for [i (range 5000)] ;; non-셀프 숫자 집합
               (+ i (apply + (map (comp read-string str) (str i))))))))


1 부터 5000 까지 제너레이터 집합을 구한 뒤, 1~5000 집합에서 차집합으로 셀프넘버를 구했음.
=> 1227365

2015/03/11 00:49

jung dongjin 정동진

자신의 수까지 d() 를 구하면서 self-number인지 체크한다.

package coding.lv1;

import static org.junit.Assert.*;

import org.junit.Test;

public class SumOfSelfNumbersTest {

    /*
     * n is a generator of d(n)
     * ex) d(91) = 9+1 + 91 = 101
     * 
     * self-number is the number which doesn't have any generators
     */

    @Test
    public void itShouldCalculateSumOfSelfNumbers() {
        SumOfSelfNumbers selfNumber = new SumOfSelfNumbers();

        assertEquals(101, selfNumber.dOfGenerator(91));
        assertEquals(103, selfNumber.dOfGenerator(92));

        assertTrue(selfNumber.isSelfNumber(1));
        assertTrue(selfNumber.isSelfNumber(3));
        assertTrue(selfNumber.isSelfNumber(20));
        assertTrue(selfNumber.isSelfNumber(31));

        assertEquals(0, selfNumber.sumWithRange(1,1));
        assertEquals(1, selfNumber.sumWithRange(1,2));
        assertEquals(0, selfNumber.sumWithRange(2,3));
        assertEquals(5, selfNumber.sumWithRange(5,6));

        assertEquals(1+3+5+7+9, selfNumber.sumWithRange(1,10));

        int sumWithRange = selfNumber.sumWithRange(1, 5000);
        System.out.println("Sum Of SelfNumbers : " + sumWithRange);
        assertEquals(1227365, sumWithRange);
    }


    public class SumOfSelfNumbers {
        public int dOfGenerator(int generator) {
            int d = generator;
            for (char c : (generator+"").toCharArray())
                d += (c - '0');
            return d;
        }

        public boolean isSelfNumber(int d) {
            for (int i = 1; i < d; i++)
                if( dOfGenerator(i) == d ) return false;
            return true;
        }

        public int sumWithRange(int start, int end) {
            int sum = 0;
            for (int i = start; i < end; i++)
                sum += isSelfNumber(i)?i:0;
            return sum;
        }
    }
}

2015/03/15 23:30

노광선

자바 arraylist 사용 답 : 1227365

코딩도장 재밌네요.ㅎㅎ

import java.awt.List;
import java.util.ArrayList;


public class generator {

    public static void main(String[] args) {
        int sum = 0;
        ArrayList<Integer> num = new ArrayList<Integer>();
        ArrayList<Integer> geneNum = new ArrayList<Integer>();
        for(int i= 1; i < 5001 ;i++){                       //1~5000까지 숫자 저장
             num.add(i);
        }
        for(int i= 1; i < 5001 ;i++){                       //제너레이터 저장
             geneNum.add( generator(i));
        }
        num.removeAll(geneNum);                             //1~5000 중에 제너레이터 삭제
        for(int i= 0; i<num.size();i++){                    //셀프넘버 더하기
            sum+=num.get(i);
        }
        System.out.println(sum);
    }
    private static int generator(int i) {  //제너레이터 
        int one = 0;
        int ten = 0;
        int hud = 0;
        int thou = 0;
        int temp = 0;
        int origin =i;
        if (i >= 1000){
            thou = i/1000;
            i = i%1000;
        }
        if (i >= 100){
            hud = i/100;
            i = i%100;
        }
        if (i >= 10){
            ten = i/10;
            i = i%10;
        } 
        if(i<10){
            one = i;
        }
        return temp = thou + hud + ten + one + origin;
        }
}

2015/04/02 13:59

김동준

저는 c 언어로 작성했는데요. 범위를 정해주면 그 수까지의 셀프 넘버들과 그 수까지의 총 합을 구하게 만들었습니다. 5000 까지의 셀프 넘버들의 총 합은 1227365 입니다.

#include <stdio.h>

int main(void)
{
    int a = 0, b = 0, c = 0, d = 1, e = 0, f = 0, g = 0, h = 0, i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, s = 0, t = 0, u = 0, v = 0, w = 0, x = 0;
    int arr1[10000], arr2[10000], arr3[10000], arr[10000];
    printf("몇까지 셀프 넘버를 구할것인가? 그 수까지의 셀프 넘버와 총 합을 알려주겠다.");
    scanf("%d", &a);

    for(c = 0; c <= a;)
    {
        c++;
        n = c;
        t = c;
        f = 0;
        while(1)
        {           
            d = 10;
            c = (int) c/d;
            if(c==0)
                break;
            f++;
        }
        d = 1;
        k = 0;
        while(k <= f)
        {
            k++;
            d = d*10;
        }
        p = n;
        while(1)
        {               
            if(d==1)
            {   e = e+n;
                break;
            }
            h = n/d;
            n = n%d;
            d = (int) d/10;
            e = e+h;
        }       
        g = t+e;
        arr1[t] = g;
        c = p;
        e = 0;
        u = 0;
    }   
    t = 1;
    c = 1;

    for(c = 1; c <= a; c++)
    {       
        for(s = 1; s <= a; s++)
        {           
            if(arr1[c]==s)
            {
                arr2[s] = s;                
                break;
            }
        }
    }
    for(q = 1; q <= a; q++)
    {
        if(q==arr2[a])
            break;
        if(arr2[q]==q)
            continue;
        else
        {
            arr[q] = q;
            continue;
        }       
    }   
    r = 1;
    for(r = 1; r <= a; r++)
    {       
        if(arr[r]==r)
        {
            x++;
            i = i + r;
            printf("self-number %d: %d\n", x, r);
        }
    }

    printf("sum of self numbers by number you limited: %d\n", i);
    return 0;
}

2015/04/06 11:36

전승빈

python 으로 작성하였습니다.

nums_list = []

for i in range(1, 5000):             #5000까지의 d function image를 넣는다. 자기 자신을 더해야하므로 d(n) > n 이 항상 성립한다.
    n = i + i%10 + (i%100)//10 + (i%1000)//100 + i//1000
    if n not in nums_list :
        nums_list.append(n)

sum = 0            #이제 1~5000 까지 d function 으로 만들 수 없는 수를 구한다.
for i in range(1, 5001):
    if i not in nums_list:
        sum = sum + i

print(sum)

1227365

2015/04/09 21:27

Se-Young Kim

첫 문제 풀어봤습니다. 아직 초보라 많이 미숙합니다ㅎㅎ

이런 식으로 풀이한다면 알고리즘 수행시간이 꽤 길어질 듯 합니다.

/*
어떤 자연수 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까지 수 중에서 Generator를 체크한다. 그 중 제네레이터 인 것은 미리 설정해둔 배열에 True로 표시한다.
// 2. 마지막으로 1에서 5000까지 수 중에서 미리 설정해둔 배열에 False값이 있는 것만 차례대로 더해나간 후 합계를 출력한다.

public class Nexon_problem{

    static boolean[] check = new boolean[5000];

    public static void main(String [] args)
    {
        int fourth, third, second, first, sum = 0;

        for(int i=1; i<5000; i++)
        {
            fourth=(i/1000)%10;
            third=(i/100)%10;
            second=(i/10)%10;
            first=i%10;
            sum = fourth+third+second+first+i;

            if((1<=sum) && (sum<5000))
                check[sum] = true;
        }

        int total = 0;

        for(int j=1; j<5000; j++)
        {
            if(check[j]==false)
                total += j;
        }

        System.out.println("total: " + total);
    }
}

2015/04/18 22:27

홍옥

swift로 작성해보았습니다




let MIN_NUMBER = 1
let MAX_NUMBER = 5000

// 숫자 제네레이터 함수
// ex) d(91) = 9 + 1 + 91 = 101
func generator(number : Int) -> Int{

    var total = 0
    for char in Array(String(number)){
        total += String(char).toInt()!
    }

    return total + number
}

// number hashSet
var entireNumbers : Set<Int> = Set<Int>(MIN_NUMBER...MAX_NUMBER)

// 주어진 범위에서 generator에 의해 생성 된 값을 제거
for num in MIN_NUMBER...MAX_NUMBER{
    entireNumbers.remove(generator(num))
}

// 남아있는 hashSet 요소들이 셀프 넘버이므로 요소들을 모두 더한다.
let sum = reduce(entireNumbers, 0, {return $0 + $1})
println(sum)

2015/04/25 10:38

hyung-gue jeon

자바코드

public class FindSelfNumber { private static final int endNum =5000;

public static void main(String[] args) {
    int sumSelfNum = 0 ;

    for(int i =1; i<endNum; i++){
        if(checkSelfNum(i)){                         // SelfNumber라고 확인될 시 sumSelfNum 변수에 더함.
            sumSelfNum +=i;
        }
    }

    System.out.println("1~"+endNum+"까지의 SelfNumber의 합은 : " +sumSelfNum);
}

public static int findGenerator(int selfNum){                    // 받은 숫자의 각 자리수를 모두 더함.
    int nmg=selfNum%10;

    if(selfNum >=10){
        selfNum /=10;
        nmg+=findGenerator(selfNum);
    }
    return nmg;
}

public static boolean checkSelfNum(int num){         // 제너레이터가 존재하지 않는 경우 SelfNumber 라고 생각하여 true를 반환
    boolean check = true;

    for(int i =1; i<num; i++){
        if(num == i+findGenerator(i)){
            check = false;
            break;
        }
    }

    return check;
}

}


자바라 짜봤습니다.

정답인지는 잘 모르겠어요 지적부탁드립니다.

결과 창 : 1~5000까지의 SelfNumber의 합은 : 1227365

2015/04/26 16:34

Kim Minsic

python 2.7입니다. d(abcd)의 값이 1001a+101b+11c+2d라서 self number집합 만들어서 여집합을 구했어요~

#365.py


#data 
set1=set(range(1,5001))
set2=set()
for a in range(5):
    for b in range(10):
        for c in range(10):
            for d in range(10):
                set2.add(int(1001*a+101*b+11*c+2*d))

answer_set= set1-set2
print sum(answer_set)

2015/05/04 10:54

심재용

파이썬 코딩으로 어떻게 하면 되는지 찾아봤어요~. 전에 푸신 코드를 참고했습니다!

#393.py
print str(range(10001)).count('8')

2015/05/04 11:05

심재용

set range 4999
set sum_all_num 0
for {set x 1} {$x <= $range} {incr x} {
    set sum_all_num [ expr $sum_all_num + $x ]
    set split_x_num [ split $x {} ]
    set generator   [ expr $x + [ join $split_x_num "+" ]]
    if { $generator <= $range } {
        lappend generator_num_list  $generator
    }
}
set sum_generator_num [ expr [ join [ lsort -integer -unique $generator_num_list ] "+" ]]
set sum [ expr $sum_all_num - $sum_generator_num ]


Tcl/tk 입니다.
문제 풀이보다는 문제 자체를 이해하는데 더 오래걸렸네요.ㅠ

2015/05/08 11:30

YS_SHIN

C#으로 재귀함수를 이용해서 작성해 보았습니다.

        private void button1_Click(object sender, EventArgs e)
        {
            List<int> sumArray = new List<int>();
            for (int i = 1; i <= 5000; i++)
            {
                sumArray.Add(sumDigits(i) + i);
            }
            int sum = 0;
            for(int i = 1; i <= 5000; i++)
            {
                bool isIn = sumArray.Contains(i);
                if(!isIn) sum += i;
            }
            Console.WriteLine(sum.ToString());
        }
        private int sumDigits(int number)
        {
            int perTen = number / 10;
            if (perTen == 0) return number;
            else return number - perTen * 10 + sumDigits(perTen);
        }

2015/05/08 15:43

임 정구

c언어로 작성했습니다. 코드가 별로 비효율적이지만 나름 구현해보려고 노력했습니다.

int i,result=0,gnum=0,check[5000]={0};


for(i=1;i<5001;i++)
{
    gnum=((i%10000-i%1000)/1000)+((i%1000-i%100)/100)+((i%100-i%10)/10)+i%10+i;
    if(gnum<=5000)
        check[gnum]=1;
}

for(i=0;i<5000;i++)
{
    if(check[i]==0)
        result += i;
}

printf("%d",result);
system("pause");
return 0;

2015/05/17 10:35

장 은준

int main()
{
    int c, s1, s2, s3, s4;
    int a[5000];
    int sum = 0;
    for(int i = 0; i < 5000; i++) {
     a[i] = i+1;
    }

    for(int i = 0; i < 5000; i++) {
     s1 = i/1000;
     s2 = (i/1000 - s1*1000)/100;
     s3 = ((i/1000 - s1*1000) - s2*100)/10;
     s4 = (((i/1000 - s1*1000) - s2*100) - s3*10);

     c = s1 + s2 + s3 +s4 + i;

     if ( c < 5000) a[c] = 0;
     }

     for(int i = 0; i < 5000; i++) {
      sum += a[i];
     }

   cout << "합: " << sum << endl;

   return 0;
}

2015/06/02 09:47

이 자현

문법만 lisp 이네요 ㅠ

(defun generator (n)
    (let
        (
            (sum n)
            (num-list (coerce (princ-to-string n) 'list))
        )
        (dolist (num num-list)
            (setf sum (+ sum (digit-char-p num)))
        )
        sum
    )
)

(let*
    (
        (generatable-set (loop for n from 1 to 5000 collect (generator n)))
        (selfnumber-set (loop for n from 1 to 5000 when (not (find n generatable-set)) collect n))

        (sum 0)
    )
    (mapcar
        (lambda (i)
            (when (<= i 5000)
                (setf sum (+ sum i))
            )
        )
        selfnumber-set
    )
    sum
)


2015/06/06 09:55

꽃샘더위

PHP 로 작성했습니다.

<?php
    const BEGIN = 1;
    const END = 5000;

    // 1~5000까지의 숫자를 배열로 저장     
    $arr = range(BEGIN, END);

    // Genarate : 각 자리수의 합 + 원래 자기의 수
    $generate = function($arg) {
        return array_sum(str_split($arg, 1)) + $arg;
    };

    // 1~5000까지의 Generate의 숫자를 확인하여
    // Generate가 존재하면 숫자를 저장한 배열에서
    // 해당 값이 존재하면 0으로 셋팅한다.
    foreach (range(BEGIN, END) as $value) 
    {
        $key = array_search($generate($value), $arr);

        if(!empty($key)) $arr[$key] = 0;

    }

    echo "result is ".array_sum($arr);

?>

2015/06/11 16:08

Hyun Jung Lee

#!/usr/bin/python

tmp_sum = 0             ## 하나의 제너레이터로 나올 수 있는 수를 잠시동안 넣을 변수
digit = 0
sum = []                ## 여기는 1~5000까지의 범위의 제너레이터를 이용해 나울 수 있는 수를 넣을 리스트  
self_num = []           ## 변수 이름 그대로 self_number들이 들어갈 리스트
self_num.append(1)      ## 1이 self_number이기 때문에 리스트에 미리 넣음. 사실 line 24에 나오는  for funtion에서 1이 추가가 안됨
result = 0              ## self_number의 합을 여기다가 넣을거다

for i in range(1,5001): ## 여기는 1~5000까지의 범위의 제너레이터를 이용해 나울 수 있는 수를 리스트에 추가한다

    digit = len(str(i)) ## 변수 digit, 이름 그대로 한 제너레이터의 숫자 길이를 구함 
    digit -= 1          ## 1을 미리 빼는 이유는 line 16 에서 digit이 array index로 쓰이기 때문이다

    tmp_sum =+ i        ## tmp_sum에다가 generator 숫자를 더함

    while digit >= 0:   ## tmp_sum을 구하는 과정이다    
        tmp_sum += int(str(i)[digit])
        digit -= 1

    sum.append(tmp_sum) ## sum에 generator로 구한 수를 넣는 과정

sum.sort()              ## 구한 숫자들을 크기순서대로 재배열한다

for i in range(4999):   ## 여기서부터 self_number 를 구하기 시작한다.
    a = sum[i]          ##slef_number 를 구하는 여러 방법중에 내가 생각한 방법은 
    b = sum[(i + 1)]    ##2개의 숫자를 서로 비교해서 그 숫자들 사이의 정수를 self_number
    c = b - a -1        ##리스트에 넣는 방법이다 
    while c > 0:
        d = b - c       ## 변수 d는 두 숫자사의 값이다
        self_num.append(d)
        c -= 1
'''
for i in range(len(self_num)):  ## 이상하게도 이 방법을 사용할려고 하면  
    if self_num[i] > 5000:      ##IndexError: list index out of range
        del self_num[(i)]       ##라는 에러를 낸다 근데 아무리 생각해도 i라는 
                                ##index는 self_num index범위안에 있다. 

'''
del self_num[499]               ##그래서 직접 하나씩 없앴다.
del self_num[498]
del self_num[497]
del self_num[496]
del self_num[495]
del self_num[494]

#print(self_num)

for a in self_num:      ## 모든 self_number의 합을 구하는 과정
    result += a
print(result)

2015/06/11 20:55

전영배

#include <stdio.h>

int total[5001];

int main() {

    int temp;
    int sum;
    for(int i=1;i<=5000;i++) {
        for(int j=1;j<=i;j++) {
            temp=j;
            sum = j;
            while(temp!=0) {
                sum += temp%10;
                temp/=10;
            }
            if(sum==i){
            total[i]=1;
            break;
            }
        }
    }
    for(int i =1;i<5000;i++) {
        if(total[i]==0)
        printf("%d  ",i);
    }
}


합을 구하는 건 그냥 그래서 셀프 넘버를 출력하는 프로그램입니다. 너무 좋은 풀이 법들이 많네요. 특히 C++이 최고인 줄 알았는데 파이썬의 강력함에 놀라고 갑니다.
파이썬 공부해야겠네요.

2015/06/13 22:25

꼼빠냐

int r = 0;
int Ge(int n)
{ 
   int r = n;
   while(n != 0)
   {
     r += n%10;
     n = n / 10;
    }
}
static void main(string[] args)
{
  bool[] selfs = new bool[5001];
  for(int i = 1; i < 5000; i++)
  {
    if(Ge(i) <=5000)
    {
      selfs[i] = false;
     }
   }
     for(int i = 1; i < 5000; i++)
  {
    if(selfs[i])
    r += i;
   } 
   Console.WriteLine(r);
}

2015/06/14 01:50

정우진

#include <stdio.h>

int main() {
    int a[5000];
    int b,c,d,e;
    int sum = 0;
    int i;
    for(i=1;i<5000;i++){
        a[i] = i+1;
    }
    for(i=0; i<5000; i++){
        b = i/1000;
        c = (i/1000 - b*1000)/100;
        d = ((i/1000 - b*1000) - c*100)/10;
        e = (((i/1000 - b*1000) - c*100) - d*10);

        sum = b + c + d + e;
        if(sum < 5000){
            a[c] = 0;
        }
        for(int i=0; i <5000; i++){
            sum += a[i];
        }
    }
    printf("%d", sum);
    return 0;

2015/06/14 17:12

hanjonghoon

Python 2.7.8 사용중입니다.

def gen(n):
    y=n
    y+=sum([int(str(n)[i]) for i in range(len(str(n)))])
    return y
a=[gen(n) for n in range(1,5000)]
b=[i for i in range(1,5000) if not i in a]

print sum(b)

=> 첫번재 작성한 버젼

print sum(set(range(1,5000))-{x + sum([int(i) for i in str(x)]) for x in range(1,5000)})

=> 코드들 참조해서, 두번째 작성한 버젼

2015/06/15 01:31

NoelBird

#include <stdio.h>
#include <Windows.h>


int func1(int generator)
{
    int num = generator;
    while( generator > 0)
    {

        num += generator % 10;
        generator /= 10;
    }
    return num;
}
int main()
{
    bool table[5001];
    int self = 0;

    for(int i=0;i<=5000;i++)
        table[i] = true;

    for(int i=0;i<=5000;i++)
    {
        if(table[i])
            self += i;

        int generator = func1(i);

        if( generator <= 5000 )
            table[generator] = false;
    }


    printf("%d",self);
    system("pause");
}

2015/06/17 12:01

심 기용

파이썬입니다~

result = {}
for i in range(1, 5000):
    n = i + sum([int(x) for x in str(i)])
    if n in result:
        result[n].append(i) # i는 n의 제너레이터
    else:
        result[n] = [i]
ans = 4999 * 5000 / 2 - sum([x for x in result.keys() if x < 5000])
print(ans)

2015/06/17 12:35

룰루랄라

package test;

public class SelfNumber {


    public static void main(String[] args){

        int[] result = new int[4999];
        for( int i = 1; i < 5000; i++){
            result[i-1] = i;
        }

        int sum = 0;
        for( int i = 1; i < 5000; i++){
            sum += i;
            String temp = String.valueOf(i);
            for( int j = 0; j < temp.length(); j++){
                sum += Integer.parseInt(temp.substring(j, j+1));
            }
            if( sum < 5000){
                result[sum-1] = 0;
            }

            sum = 0;
        }

        int totalResult = 0;
        for( int i = 1; i < 5000; i++){
            if( result[i-1] != 0 ){
                totalResult +=result[i-1];

            }
        }
        System.out.println(totalResult);
    }
}

2015/06/17 13:50

최 종수

import java.util.*;

public class dojo3
{
  public static void main(String[] args)
  {
    int count = 0;
      int sum = 0;
    String st = "";
    boolean[] ans= new boolean[5001];
    Arrays.fill(ans,true);
    for(int i=0 ; i<=5000;i++){
      if(gen(i)<=5000){
      ans[gen(i)] = false;
      }
    }
    for(int j=0;j<=5000;j++)
    {
      if(ans[j] == true)
      {
        count++;
        sum += j;
        st = st + "  " + Integer.toString(j);
      }
    }
    System.out.println("total nums : " + count);
    System.out.println("Total sums : " + sum);
    System.out.println(st);

  }

  public static int gen(int a)
  {
    String s = Integer.toString(a);
    char[] b = s.toCharArray();
    int[] c = new int[b.length]; 
    Arrays.fill(c,0);
    for(int i = 0 ; i<b.length;i++)
    {
     c[i] = Integer.parseInt(Character.toString(b[i]));
    }
    int tot = 0;
    for(int i = 0 ; i<c.length;i++)
    {
      tot +=c[i];
    }
    tot+=a;
    return tot;
  }
}

total nums : 494 Total sums : 1227365 1 3 5 7 9 20 31 42 53 64 75 86 97 108 110 121 132 143 154 165 176 187 198 209 211 222 233 244 255 266 277 288 299 310 312 323 334 345 356 367 378 389 400 411 413 424 435 446 457 468 479 490 501 512 514 525 536 547 558 569 580 591 602 613 615 626 637 648 659 670 681 692 703 714 716 727 738 749 760 771 782 793 804 815 817 828 839 850 861 872 883 894 905 916 918 929 940 951 962 973 984 995 1006 1021 1032 1043 1054 1065 1076 1087 1098 1109 1111 1122 1133 1144 1155 1166 1177 1188 1199 1210 1212 1223 1234 1245 1256 1267 1278 1289 1300 1311 1313 1324 1335 1346 1357 1368 1379 1390 1401 1412 1414 1425 1436 1447 1458 1469 1480 1491 1502 1513 1515 1526 1537 1548 1559 1570 1581 1592 1603 1614 1616 1627 1638 1649 1660 1671 1682 1693 1704 1715 1717 1728 1739 1750 1761 1772 1783 1794 1805 1816 1818 1829 1840 1851 1862 1873 1884 1895 1906 1917 1919 1930 1941 1952 1963 1974 1985 1996 2007 2022 2033 2044 2055 2066 2077 2088 2099 2110 2112 2123 2134 2145 2156 2167 2178 2189 2200 2211 2213 2224 2235 2246 2257 2268 2279 2290 2301 2312 2314 2325 2336 2347 2358 2369 2380 2391 2402 2413 2415 2426 2437 2448 2459 2470 2481 2492 2503 2514 2516 2527 2538 2549 2560 2571 2582 2593 2604 2615 2617 2628 2639 2650 2661 2672 2683 2694 2705 2716 2718 2729 2740 2751 2762 2773 2784 2795 2806 2817 2819 2830 2841 2852 2863 2874 2885 2896 2907 2918 2920 2931 2942 2953 2964 2975 2986 2997 3008 3023 3034 3045 3056 3067 3078 3089 3100 3111 3113 3124 3135 3146 3157 3168 3179 3190 3201 3212 3214 3225 3236 3247 3258 3269 3280 3291 3302 3313 3315 3326 3337 3348 3359 3370 3381 3392 3403 3414 3416 3427 3438 3449 3460 3471 3482 3493 3504 3515 3517 3528 3539 3550 3561 3572 3583 3594 3605 3616 3618 3629 3640 3651 3662 3673 3684 3695 3706 3717 3719 3730 3741 3752 3763 3774 3785 3796 3807 3818 3820 3831 3842 3853 3864 3875 3886 3897 3908 3919 3921 3932 3943 3954 3965 3976 3987 3998 4009 4024 4035 4046 4057 4068 4079 4090 4101 4112 4114 4125 4136 4147 4158 4169 4180 4191 4202 4213 4215 4226 4237 4248 4259 4270 4281 4292 4303 4314 4316 4327 4338 4349 4360 4371 4382 4393 4404 4415 4417 4428 4439 4450 4461 4472 4483 4494 4505 4516 4518 4529 4540 4551 4562 4573 4584 4595 4606 4617 4619 4630 4641 4652 4663 4674 4685 4696 4707 4718 4720 4731 4742 4753 4764 4775 4786 4797 4808 4819 4821 4832 4843 4854 4865 4876 4887 4898 4909 4920 4922 4933 4944 4955 4966 4977 4988 4999

2015/06/20 12:26

전 진혁

public class NexonRecruiting {

    private boolean[] field;

    /**
     * @param num
     */
    public NexonRecruiting(int num) {
        field = new boolean[num];

        for (int i = 0; i < num; i++) {
            field[i] = false;
        }
        run(num);
    }

    /**
     * @param generator
     * @return
     */
    int formula(int generator) {

        int d_n = generator;
        int tmp = generator;

        while (tmp > 0) {

            d_n += tmp % 10;
            tmp = tmp / 10;
        }

        return d_n;
    }

    /**
     * @param num
     */
    public void run(int num){
        int sum=0;

        for(int i=1; i<num; i++){
            //case, not self-number
            if(i != formula(i)){
                if(formula(i) >= num)
                    continue;
                field[formula(i)] = true;

            }
        }

        //sum(self-number)
        for(int i=1; i<num; i++){
            if(field[i] == false){
                sum += i;
            }
        }

        System.out.println("1이상이고 " + num +"보다 작은 모든 셀프 넘버들의 합은 "+ sum);

    }
}

2015/06/23 02:12

Kim Yongmin

#include <iostream>
using namespace std;

int d(int num)
{
    int sum = 0;
    sum += num;
    while(num){ 
        sum += num % 10;
        num/=10;        
    }

    return sum;
}


void main(void)
{

    int num = 0;
    int i = 0;
    int j = 0;

    for(int k = 1; k <= 5000; ++k)
        num += k;

    while(j < 5000){
        j = d(i++);
        num -= j;
    }   

    cout<<"결과는 : "<<num<<endl;      
}

해당 범위의 총 합에서 셀프넘버가 아닌 숫자를 빼는 방법으로 구현해 봤습니다. 사용 언어는 visual c++입니다. 초보라 많이 부족합니다.조언 부탁드립니다.

2015/07/10 17:05

Kim Joomin

public class D {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        int res = 0;

        for(int i = 1; i <= 5000; i++) {
            list.add(d(i));
        }

        for(int i = 1; i <= 5000; i++) {
            int flag = 0;
            for(int n : list) {
                if(i == n) {
                    flag = 1;
                    break;
                }
            }

            if(flag == 0) {
                System.out.println(i);
                res += i;
            }
        }

        System.out.println(res);    // 1227365
    }

    public static int d(int n) {
        String temp = Integer.toString(n);
        int res = n;

        for(int i = 0; i < temp.length(); i++) {
            res += (temp.charAt(i) - '0');
        }

        return res;
    }
}

2015/07/21 18:01

고영감

String gen = ""; for(int i = 1 ; i < 5000; i++){ int count = 0; int sum = 0;
String str = Integer.toString(i);

        for (int j = 0; j < str.length(); j++) {
                count = count + Integer.parseInt(str.substring(j,j+1)); 
        }
        sum = count + i;

        gen = gen +","+ sum;
        count = 0;

    }
    int total = 0;

    for(int i = 1 ; i < 5000; i++){

        if(!gen.contains(","+Integer.toString(i)+",")){
            total += i;         
        }

    }
    System.out.println(total);

쩝 다른분들이 만든거를 보니 초라해지네요 ㄷㄷ

2015/07/23 15:47

이 윤호

public class Generator {
    private Integer[] generator;
    public Generator(){
        SetNumber();
    }
    public void SetNumber(){
        generator = new Integer[4999];
    }
    public void generatorAnswer(){
        int sum=0, z = 0;
        for(int i = 1 ; i < 5000 ;i++){
            z = i;
            while(z > 0){
                sum += z%10;
                z /= 10;
            }
            sum += i;
            this.generator[i-1] = sum;
            sum =  0;
        }
    }
    public void SelfNum(){
        int sum = 0; Boolean flag;
        generatorAnswer();
        for(int i = 1 ; i <= 5000 ; i++){
            flag = true;
            for(int j = 0 ; j < 4999 ; j++){
                if(this.generator[j] == i){
                    flag = false; 
                }
            }
            if(flag == true){
                sum += i;
            }
        }
        System.out.println(sum);
    }
    public static void main(String[] args) {
        Generator number = new Generator();
        number.SelfNum();
    }
}

2015/07/28 21:13

김 민성

int generator(int input)
{
    int result = input;

    while (input > 0)
    {
        result += input % 10;
        input /= 10;
    }

    return result;
}

void exce1()
{
    int nonSelf[5000];
    int sum = 5001 * 2500;

    memset(nonSelf, 0, sizeof(nonSelf));
    for (int i = 1; i <= 5000; i++)
    {
        if (generator(i) <= 5000)
        {
            nonSelf[generator(i) - 1] = 1;
        }
    }
    for (int i = 0; i < 5000; i++)
    {
        if (nonSelf[i] == 1)
            sum -= (i + 1);
    }

    printf("결과는 %d 입니다.", sum);
}

논셀프넘버를 먼저 추린다음에 1~5000 전체 합에서 빼는식으로 구하였습니다.

2015/08/10 10:12

조서현

# 1~5000까지의 generator를 다 구한후 중복값이 0개를 가지는 값들을 구했습니다.

def generator(ibuff):
    res = 0
    for i in range (0, len(ibuff)):
        res += int(ibuff[i])
    res += int(ibuff)
    return res

generator_list = []
for i in range(0,5000):
    generator_list.append( generator(str(i)) )

res_sum =0 
for i in range(0,5000):
    if generator_list.count(i) < 1:
        res_sum += i

print res_sum

2015/08/10 14:09

Park Guntae

gen = []
for i in range(1, 5000):
    tmpStr = str(i)
    tmpNum = i
    for j in range(len(tmpStr)):
        tmpNum += int(tmpStr[j])
    gen.append(tmpNum)

gen = [x for x in gen if x < 5000]
genTotal = sum(set(gen))
answerTotal = sum(set(range(5000)))

print(answerTotal - genTotal)

2015/08/10 14:29

A

__author__ = 'Lee'


def make_d(n):
    l = list(str(n))
    target = 0
    for i in l:
        target += int(i)
    result = int(n) + target
    return result


def cal():
    num_set = {0,}
    num_ori = {0,}
    y = 0
    for i in range(1,5001):
        num_ori.add(i)
        num_set.add(make_d(i))
    result = num_ori - num_set
    for j in range(1, len(result)+1):
        y += result.pop()
    return y

print(cal())


열심히 배우고 있어요~

2015/08/17 10:41

Lee Sungwoo

package test;

import java.util.ArrayList;
import java.util.Arrays;

public class SelfNumber {
    public static void main(String[] args) {
        int num, sum = 0, nonsum = 0;
        int[] index = new int[5000];
        int[] hasGenerator = new int[5000];
        ArrayList<Integer> nonself = new ArrayList<Integer>();

        for(num = 1;num<=5000;num++){
            index[num-1] = num;
            calGenerator(num);
            sum += num;
            hasGenerator[num-1] = calGenerator(num);
            int i = num - 1;

            if(calGenerator(num)>=1 && calGenerator(num)<5000){
                if(!nonself.contains(hasGenerator[i])){
                    nonself.add(hasGenerator[i]);
                    nonsum += hasGenerator[i];
                }
            }
        }
        sum -= 5000;
        System.out.println(sum - nonsum);
    }   
    public static int calGenerator(int num){
        int gen=0;      
        if(num>=1000){
            gen = num + (num/1000)%10 + (num/100)%10 + (num/10)%10 + num%10;
        } 
        if(num>=100 && num<1000) {
            gen = num + (num/100)%10 + (num/10)%10 + num%10;            
        } 
        if(num>=10 && num<100){
            gen = num + (num/10)%10 + num%10;   
        } 
        if(num<10) {
            gen = num + num%10;
        }
        return gen;
    }
}

2015/08/27 14:56

임 어진

#include <stdio.h>
#include <stdlib.h>


int listing[10000];

int quotient (int a, int b);
int generator (int d);
int lister(int ff);


int main(void)
{
    int findout;
    printf("Please insert an appropriate number: ");
    scanf("%d", &findout);
    if (findout <= 0 || findout > 5000)
    {
        printf("Meaningless Number. \nComputing interrupted.\n");
        exit(1);
    }/*
    else
    {
        int listing[findout];
    }*/

    int cnter;
    for (cnter = 1; cnter <= 5000; cnter++)
    {
        /*printf("Meaningless Number. \nComputing interrupted.\n");*/
        if(identifier(cnter) == 0)
        {
            /*printf("Meaningless Number. \nComputing interrupted.\n");*/
            listing[cnter] = cnter;
        }
    }

    int ii;
    int total;
    for (ii = 1; ii <= findout; ii++)
    {
        printf("%d, ", listing[ii]);
        total = total + listing[ii];
    }

    printf("\n\nThe Summary is: %d !!!", total);

    return 0;
}


int quotient (int a, int b)
{
    int c = a % b;
    a = a - c;
    int ddd;
    ddd = a / b;
    return ddd;
}

int generator (int d)
{   
    int tmp = d;
    int cnt;
    int digit = 0;
    for(cnt = 1; (d / cnt) > 0; cnt = (cnt*10))
    {
        if (cnt == 1)
        {
            digit = digit + (d % 10);
        }
        else
        {
            digit = digit + ((d/cnt) % 10);
        }
    }

    /* get the aggregate of each digit */
    int summ = 0;
    summ = digit + d;

    return summ;
}

int identifier(int fff)
{
    int cnti;
    int trorfal;
    for(cnti = 1; cnti <= fff; cnti++)
    {
        int tmp;
        tmp = generator(cnti);
        if (tmp == fff)
        {
            trorfal = 1;
            break;
        }
        else
        {
            trorfal = 0;
        }
    }

    return trorfal;
}

C로 작성했습니다.

구조화한 설계를 하면서, 배열을 주어진 숫자 범위보다 넉넉히 크게 하였습니다. 그래도 가변적으로 배열의 크기를 조정하지는 못했네요. 너무 길지만...가독성만 높다고 생각합니다. ㅠㅠ

추가. 중간에 listing 배열을 재정의하여, 입력되는 숫자값대로 배열의 크기를 재조정하려고 했던 것이 모든 셀프 넘버들의 합 값을 어그러뜨리는 결과를 낳는다는 사실을 확인하였습니다. 이런 식으로 재정의하면 안 되는 줄 몰랐는데...다른 함수들에서는 이것이 문제를 일으키지 않았지만 main 함수 내에서의 이러한 잘못된 재정의가 오류를 불러일으킴을 확인하고, 값을 다시 구했습니다. 답은 1227365로 도출되었습니다.

2015/09/04 23:02

박재우

Ruby 입니다. 아직 초보라서, 다른 분들 풀이 좀 참고해서 해봤습니다.

arr = (1...5000).to_a
for x in 1...5000
    d_n = x
    for y in x.to_s.split(//)
        d_n += y.to_i
    end
    if arr.include? d_n
        arr.delete(d_n)
    end
end
puts arr.inject(:+)

2015/09/16 13:30

CodingKismet

def d(n):
    sum=n
    for i in str(n):
        sum+=int(i)
        if sum>5000:
            return 0
    return sum

print(sum(set(range(1,5001))-set(map(d,range(1,5000)))))

같은 파이선인데 1줄이라니;; 인간인가;;

2015/09/17 16:40

Graed

c++로 짜보았습니다. self number들도 모두 출력하게끔 프로그램하였습니다.

#include <stdio.h>
int main(void)
{
    int num, gen, chk = 0, sum = 0; //http://codingdojang.com/scode/365
    printf("Self number is : \n");
    for (num = 1; num < 5000; num++)
    {
        for (gen = 1; gen < num; gen++)
        {

            if ((gen + (gen / 1000) + (gen / 100 - 10 * (gen / 1000)) + (gen / 10 - 10 * (gen / 100)) + (gen % 10)) == num)
            {
                chk = 1;
                break;
            }
        }
        if (chk == 0)
        {
            printf("%4d ", num);
            sum = sum + num;
        }
        chk = 0;
    }
    printf("\n\n5000 미만의 Self number 들의 합은 %d\n", sum);
    return 0;
}

2015/09/20 15:43

진재훈

#include<iostream>
using namespace std;

int gen(int num1){
    int sum=0;
    sum+=num1;
    while(num1){
        sum+=(num1%10);
        num1=num1/10;
    }
    return sum; //제너레이팅 결과값
}

int checkself(int sum){
    for(int i=0;i<5000;i++){
    if(sum==gen(i)) return false;
    }
    return true;
}


int main(){
    int sum=0;
    for(int j=1;j<5000;j++){
        if(checkself(j)==true)
        sum+=j;
    }
    cout<<sum<<endl;
    return 0;
}

i의 범위 때문에 고민을 좀 많이 했지만 해결했습니다. 답 : 1227365

2015/09/30 16:09

맹꼬

public class Main {

    public static void main(String[] args) {
        ArrayList<Integer> sample = new ArrayList<Integer>();
        ArrayList<Integer> result = new ArrayList<Integer>();
        int sum = 0;

        for (int i = 1; i < 5001; i++) {
            sample.add(i);
        }

        result.addAll(sample);

        for (Integer ig : sample) {
            if (generator(ig) < 5001) {
                result.set(sample.indexOf(generator(ig)), 0);
            } else {
                break;
            }
        }

        for (int i = 0; i < result.size(); i++) {
            sum += result.get(i);
        }
        System.out.println(sum);
    }

    public static int generator(int resource) {
        int sum = 0;
        String[] temp = new String(resource+"").split("");
        for (int i = 0; i < temp.length; i++) {
            sum += Integer.parseInt(temp[i]);
        }
        return resource+sum;
    }
}

출력결과 : 1227365

2015/10/01 17:21

Jae Hyunwoo

#include<stdio.h>
int Split(int num);
typedef enum {false, true} bool;

int main(void){
  bool arr[5001] ={0,};
  int i,result=0,num;

  for(i=1; i<=5000;i++){
    num = Split(i);
    if(num>=1 && num<=5000) arr[num] = 1;
    if(arr[i]==0) result +=i;
  }

  system("pause");
  return 0;
}

int Split(int num){
   int n=0;
   n = num/1000+((num/100)%10)+((num/10)%10)+num%10+num;  
   return n;
}

C로 만들었습니다.

2015/10/12 10:03

박 명환

def d(n): return sum( int(x) for x in str(n) ) + n
print sum( set(range(1, 5001)) - set(d(n) for n in range(1, 5001)) )

안녕하세요, 가입하고서 첫 풀이 등록하게 되었네요.
한창 재미를 붙여가고 있는 Python(2.7.9)으로 작성해보았습니다.

문제의 답은 1,227,365로 확인했습니다.

앞으로 잘 부탁 드리겠습니다!

2015/11/18 16:53

如 月華

Python3으로 구현했습니다. 더 짧게 작성하신 훌륭한 분들도 많네요

nums = set(range(1, 5000))
for i in range(1, 5000):
    non_self = sum(map(int, str(i))) + i
    try:
        nums.remove(non_self)
    except KeyError:
        pass

print(sum(nums))

2015/11/18 17:24

jspark

Python 3.5

def getSub(start,end) :
    sSub=set()
    valueList = list(range(start,end+1))
    for j in valueList :
        value = str(j)
        result = 0
        for i in range(0,len(value)) :
            result += int(value[i])
        sSub.add(result + int(value))
    return sSub

S_N = 1
E_N = 4999

sAll = set(range(S_N, E_N+1))
selfNumber = sum(sAll - getSub(S_N, E_N))
print(selfNumber)

2015/11/25 13:08

. anisky07

#include <stdio.h>

void main(){ 
int i,j,temp,sum_of_selfnum;

for(i=0; i<5000; i++){                               //1부터 5000사이에 셀프넘버 구하기
    for(j=1; j<i; j++){                              //1부터 자기 보다 작은 숫자까지 제너레이터로 설정하여 계산해봄
        temp = j%10 + (j/10)%10 + (j/100)%10 + (j/1000)%10;
        if(temp == j )  contitnue;                  //제너레이트가 존재시 셀프넘버가 아니므로 continue
        else if(j == i) sum_of_selfnum += j;     //for문을 끝까지 돌면 제너레이트가 없으므로 셀프넘버에 해당됨
       }
}
printf("%d", sum_of_selfnum);
}

2015/11/26 15:59

Ssunny

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace selfNumber
{
    class Program
    {
        static void Main(string[] args)
        {   
            int nMaxArray = 5000;       // 1 ~ 어떤숫자까지 체크 할것인가(자연수)
            int nMaxCheckValue = 5000;  // 루프돌면서 체크할 숫자의 Max값

            bool[] arIsNotSelfNumber = new bool[nMaxArray];
            for (int nCnt = 1; nCnt <= nMaxCheckValue; nCnt++)
            {
                int nGenResult = getGenerator(nCnt);    // while루프함수 버전

                if (nGenResult - 1 < nMaxArray)
                {
                    arIsNotSelfNumber[nGenResult - 1] = true;
                }
            }

            int nSumNaturalNum = 0;
            for (int nCnt = 1; nCnt <= nMaxArray; nCnt++)
            {
                if (arIsNotSelfNumber[nCnt - 1] == false)
                {
                    nSumNaturalNum += nCnt;
                }
            }


            System.Diagnostics.Debug.Print("1 ~ " + nMaxArray + " 까지의 셀프넘버의 합은 : " + nSumNaturalNum);

        }

        static int getGenerator(int nValue)
        {
            int nResult = 0;
            nResult += nValue;

            int nCopiedValue = nValue;
            bool bLoop = true;
            while (bLoop)
            {
                if (nCopiedValue / 10 != 0)
                {
                    nResult += nCopiedValue % 10;
                    nCopiedValue /= 10;
                    bLoop = true;
                }
                else
                {
                    nResult += nCopiedValue;
                    bLoop = false;
                }

            }

            return nResult;
        }

    }
}

2015/11/26 17:35

Lee GilChang

const int MAX = 5000;
bool[] isdn = new bool[MAX];
int t = 0, dn = 0, sum = 0;

for (int i = 0; i < MAX; t = dn = i++)
{
    do dn += t % 10;
    while ((t /= 10) >= 1);

    if (dn < MAX) isdn[dn] = true;
    if (!isdn[i]) sum += i;
}

C#으로 작성하였습니다. 순차적인 정수배열이 필요없는 인덱스 방식을 생각해보았습니다. 그리고 셀프넘버는 룹을 돌며 나오는 d(n)보다 항상 작으므로 하나의 for문으로도 간단히 처리할 수 있었습니다. 1000만개를 돌렸을때, 약 0.6초의 계산시간이 소요되었습니다.

2015/12/10 04:24

이 우람

C#

List<int> srcAry = Enumerable.Range(1, 5000 - 1).ToList();

// 제네레이터값들 획득
var noSelfNums = srcAry.Select(_v => _v.ToString().ToCharArray().Select(_c => _c - 48).Sum() + _v).ToList();

// 셀프넘버 획득
srcAry.RemoveAll(_v => noSelfNums.IndexOf(_v) >= 0);

// 합 출력
Console.WriteLine(srcAry.Sum());

-Output-------
1227365

2015/12/11 18:07

K Mc

#넥슨 입사문제 중에서

if __name__ == "__main__":
    list = list(range(1,5000))
    selfnum = list.copy()
    result = 0
    for i in list:
        k=0
        for j in str(i):
            k+=int(j)
        k+=i
        try:
            selfnum.remove(k)
        except:
            pass
    for i in selfnum:
        result+=i
    print(result)

2015/12/12 09:34

고 윤호

#include <iostream>
#include <map>

using namespace std;




int calculate(int num)
{
    int total = num;

    int tenPos = 1;
    while (num > 0)
    {
        tenPos *= 10;

        int sliceNum = num % tenPos;
        total += sliceNum / (tenPos / 10);

        num -= sliceNum;
    }


    return total;
}


int main()
{
    std::map<int, int> notSelfNumbers;

    for (int i = 1; i < 5000; ++i)
    {
        notSelfNumbers.insert(std::make_pair(calculate(i), i));
    }


    int total = 0;

    for (int i = 1; i < 5000; ++i)
    {
        if (notSelfNumbers.find(i) == notSelfNumbers.end())
        {
            total += i;
        }
    }

    cout << total << endl;


    return 0;
}

C++ 초짜가 짠 효율성 없는 코드입니다. 다들 풀이가 예술이시네요...ㄷㄷ 특히 파이썬, C#...

2015/12/16 19:05

신 동현

#include <stdio.h>
int generator(int n,int j);
int main(void){
        int arr[5000];
        int i,j,k,gencheck,sum=0;
        for(i=0;i<5000;i++){
                arr[i]=(i+1);
        }
        for(i=0;i<5000;i++){
                for(j=0,k=i;;j++){
                        k=k/10;
                        if(k<=0)
                                break;
                }
                gencheck=generator(i,j);
                if(gencheck<5000){
                        arr[gencheck-1]=0;
                }
        }
        for(i=0;i<5000;i++){
                printf("arr[%d]=%d\n",i,arr[i]);
                sum+=arr[i];
        }
        sum-=5000;
        printf("%d\n",sum);
        return 0;
}
int generator(int n,int j){
        int sum=n;
        double i=10;
        for(;j>-1;j--){
                sum+=(n%10);
                n/=10;
                i*=10;
        }
        return sum;
}

휴,,,,,, 방식은 길이5000배열에 1부터 5000까지 넣어놓고 제너레이트가 있는 배열값을 전부 0으로 바꾼뒤 전부 더해주는겁니다,, 5000보다 적은수라고 해서 마지막 5000을 빼주었습니다.

2015/12/27 11:08

김종헌

class List():
    def __init__(self,list1):
        self.list1 = list1

    def __sub__(self, other):
        for x in other.list1:
            while self.list1.count(x):
                self.list1.remove(x)
        return self.list1


if __name__ == '__main__':
    non_self = []

    for x in range(1,5000):
        non_self_num = sum([int(x) for x in str(x)]) + x
        non_self.append(non_self_num)
        if non_self_num > 5000:
            break

    self_num = List(list(range(1,5001))) - List(non_self)
    print('The total sum. of self number is %d' % sum(self_num))

2015/12/29 19:34

SPJung

def generated(x):
    npt = str(x)
    lst = []
    for i in npt:
        lst.append(eval(i))
    return sum(lst) + x

lst = []
for i in range(1, 5001):
    lst.append(generated(i))

result = []
for i in range(1, 5001):
    if i not in lst:
        result.append(i)

print result
print sum(result)

일단 제너레이터 함수를 그대로 옮겨적습니다(꼼수로 eval() 을 썼습니다) 그리고 그걸 5000까지 돌린 다음에 1~5000 집합과 위 집합의 차집합을 꺼내서 더합니다

2016/01/04 15:27

취미로재미로

#include <stdio.h>
#include <stdlib.h>

int isSelfNumber(int number);
int gen(int n);

int main(int argc, char* argv[])
{
    int i=0, a=0, b=0, sum=0, cnt=0;
    int tmp=0;
    time_t start,end; 


    if (argc!=3) {
        printf("ERROR: Input argument missing. Usage: generator.exe 1 5000");
        return 0;
    }

    a = atoi(argv[1]);
    b = atoi(argv[2]);

    for (i=a; i<=b; i++) {
        if (isSelfNumber(i)){
            tmp+=i;
            cnt++;
        }
    }

    printf("Total number of selfnumber between %d and %d is %d, and summation is %d.\n", a, b, cnt, tmp);

    return 0;
}



int isSelfNumber(int number)
{
    int i=0, b=0, cnt=0;
    int temp = 0;

    for (i=1; i<number; i++) {
        b = gen(i);
        if (number==b){
            cnt++;
        }
    }

    if (cnt==0)
        return 1;
    else
        return 0;

}

int gen(int n)
{
    int b=0, c=0;

    c = n; 
    while(c > 0){
        b += c%10;
        c = (int)(c/10);
    }
    b+=n;

    return b;
}

  • 저도 파이썬으로 해보고 싶습니다.. 공부좀 해야겠어요..
  • for loop 별로 for loop 포함된 함수를 콜하고, 그 안에서 while loop을 돌리다 보니, 속도 측면에서는 개선이 필요할 듯 합니다.
  • Total number of selfnumber between 1 and 5000 is 494, and summation is 1227365.

2016/01/05 09:51

노형석

  • python 으로 작성하였습니다. set과 차집합을 이용하였습니다.
dn=set([n+sum([int(a) for a in str(n)]) for n in range(1,5000)])
u=set(range(1,5000))

print sum(u-dn) 

2016/01/08 08:47

씨니컬우기님

sum(set(range(1, 5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)})

소스코드 이해함.

2016/01/08 13:27

Hitz

((1...5000).to_a - (1...5000).map{ |i| i.to_s.split("").push(i).map{ |i| i.to_i }.inject(:+) }).inject(:+)

루비 2.1.5입니다

2016/01/10 10:07

김카프

#include <stdio.h>

int calcGenerator(int n) {
    int temp = n;
    int generator = n;

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

    return generator;
}

int main( ) {
    int i;
    int generator;
    int selfnumberArr[5001] = {0,};

    for (i = 1; i <= 5000; i++) {
        generator = calcGenerator(i);
        if (generator <= 5000) {
            selfnumberArr[generator] = 1;
        }
    }

    result = 0;
    for (i = 1; i <= 5000; i++) {
        if (selfnumberArr[i] == 1) {
            result += i;
        }
    }

    printf("%d\n", result);
}

2016/01/11 18:54

Choi Geun Cheol

Python으로 작성

generate = lambda n : n + sum([int(x) for x in str(n)])
print(sum(set(range(1, 5000)) - set([generate(x) for x in range(1, 5000)])))

결과
1227365

2016/01/15 00:40

윤태호

Haskell

import Data.Char
import Data.List
generate n = n + sum [digitToInt x | x <- (show n)]
print $ sum $ [1..4999] \\ [generate x|x<-[1..4999]] 

결과
1227365

2016/01/15 01:16

윤태호

/* Swift 2.1 */
func generate(n: Int) -> Int {
    let nComponents = String(n).characters.map { Int(String($0)) ?? 0 }
    return nComponents.reduce(0) { $0 + $1 } + n
}

let maxNumber = 5000
let nonSelfNumbers: [Int] = Array(1...maxNumber).map { generate($0) }
let sumOfSelfNumbers = Array(Set(1...maxNumber).subtract(Set(nonSelfNumbers))).reduce(0) { $0 + $1 }

전체에서 non-self-number인 값들을 제하는 방식입니다.

2016/01/15 11:40

rainris


# coding: utf-8
# 셀프넘버 1~5000까지의 합을 구하라

def d(n):
    result = 0

    if len(str(n)) == 1:    # 한자리 일때 자신 더하기
        result = n + n
    elif len(str(n)) > 1:   # 한자리 이상일때는 각 자리수 더하기 
        for c in str(n):
            result += int(c)
        result += n 

    return result

if __name__ == '__main__':
    # 제네레이터 있는 값들만 리스트로 저장
    # 제한값보다 높게 잡아야 해당값들을 저장할 수 있다. 
    first_list = [d(n) for n in range(6000)]
    sum = 0
    # 0~5000까지 돌면서 리스트에 없는값(셀프넘버)만 저장 
    for i in range(5001):
        if i not in first_list:
            sum += i

    print sum

2016/01/23 19:33

Kang MinSu

package main

import (
    "strconv"
    "fmt"
)

func FuncD(num int) int {
    sum := num
    str_num := strconv.Itoa(num)
    for i := 0; i < len(str_num); i++ {
        sum += int(str_num[i] - '0')
    }
    return sum
}

func main()  {
    m := make(map[int]bool)
    for i := 1; i <= 5000; i++ {
        m[i] = true
    }

    for i := 1; i <= 5000; i++ {
        n := FuncD(i)
        delete(m, n)
    }

    var sum int
    for key := range(m) {
        sum += key
    }

    fmt.Print(sum)
}

2016/01/24 01:42

uuuuuup

할줄 아는게 자바밖에 없어서 ㅎㅎ

public class Application {
    static boolean arr[] = new boolean[5000];

    public static void main(String[] args) {
        int gen = 1;
        int sum = 0;
        while (true) {
            int ret = d(gen++);
            if(ret == -1)
                break;
            sum += ret;
        }
        int result = 4999*(5000)/2-sum;
        System.out.println(result);
    }

    static public int d(int gen){
        int a = gen/1000;
        int b = gen/100 % 10;
        int c = gen/10 % 10;
        int d = gen/1 % 10 ;
        int ret = a+b+c+d+gen;
        if(ret >= 5000)
            return -1;
        if(!arr[ret])
            arr[ret] = true;
        else 
            return 0;

        return ret;
    }

}

결과 : 1227365

시간 복잡도 O(n) 정도가 최선일 것 같습니다.

2016/01/28 16:51

Garam Park

자바스크립트로 풀었스빈당.

<script>
var val_sum = 0;

for(var i=1; i<5000; i++)
{
    if(calc_gen(i))
        val_sum += i;
}

console.log(val_sum);

function calc_gen(val)
{               
    for(var i=1; i<val; i++)
    {
        var str = i.toString();
        var sum = i;

        for(var j=0; j<str.length; j++)
        {
            sum += parseInt(str[j]);
        }
        if(val == sum)
            return false;;
    }
    return true;
}       
</script>

답 : 1227365

2016/01/31 16:47

Im Gwan-u

Python3 : numpy + anaconda accelerate를 이용해 작성하였습니다. 확실히 cuda로 수행하니 속도가 빠르군요~ ^^

import numpy as np
from accelerate.cuda import cuda

@cuda.jit(argtypes=[cuda.numba.i4[:], cuda.numba.i4[:]])
def cuda_generate(a, b):
    i = cuda.grid(1)
    n = a[i]
    s = 0
    while n > 0:
        s += n%10
        n = int(n/10)
    b[i] = s + a[i]

griddim = 50, 1
blockdim = 100, 1, 1

N = griddim[0] * blockdim[0]
a = np.array(range(1,5001), dtype=np.int32)
b = np.empty_like(a)

cuda_generate_configured = cuda_generate.configure(griddim, blockdim)
cuda_generate_configured(a, b)
print(sum(np.setdiff1d(a,b)))

결과
1227365

2016/02/13 02:36

윤태호

list_1 = list(range(1,5001))
list_2 = list(range(1,5001))
for a in list_1:
    if len(str(a)) == 1:
        k = a + a
        try:
            list_2.remove(k)
        except:
            pass
    elif len(str(a)) == 2:
        k = a + int(str(a)[0]) + int(str(a)[1])
        try:
            list_2.remove(k)
        except:
            pass
    elif len(str(a)) == 3:
        k = a + int(str(a)[0]) + int(str(a)[1]) + int(str(a)[2])
        try:
            list_2.remove(k)
        except:
            pass
    elif len(str(a)) == 4:
        k = a + int(str(a)[0]) + int(str(a)[1]) + int(str(a)[2]) + int(str(a)[3])
        try:
            list_2.remove(k)
        except:
            pass
    if a == 5000:
        print(sum(list_2))

처음해봐서 어렵네요. ㄷㄷ 파이썬입니다.

2016/02/20 18:34

rainbow

public void getSelfNumberSum(){

        //먼저 숫자를 넣어놓고, 지우는 방식으로.
        Map<Integer, Boolean> selfNumberMap = new HashMap<Integer, Boolean>();
        int no = 1;
        while(no < 5000){
            selfNumberMap.put(no, true);
            no++;
        }

        for(int i=1; i < 5000; i++){
            String num = String.valueOf(i);
            int numSum = 0;
            for( int j=0; j < num.length(); j++){
                numSum += Integer.parseInt(num.substring(j, j+1));
            }
            numSum += i;

            //제너레이터가 있는 숫자는 셀프넘버 맵에서 제거
            selfNumberMap.remove(numSum);

        }

        Set<Integer> selfNumbers = selfNumberMap.keySet();
        Iterator<Integer> it = selfNumbers.iterator();
        int sum = 0;
        while(it.hasNext()){
            sum += it.next();
        }

        System.out.println("self number's sum= " + sum);

    }

2016/02/23 15:54

illy

print """ 
coded in Python 2.7.10
This program is to sum self numbers 
from START number to LAST number (not included). 
"""
start=raw_input("Enter START number: ")
end=raw_input("Enter LAST number:")
(m,n)= (int(start), int(end))
a=set(range(m,n))
b=set([])
for x in range(m,n):
  y=x+sum(int(i) for i in str(x))
  if int(y)<n: b= b|set([y,])
self_numbers=a-b
print "Self-numbers from %d to %d =" %(m,n), sorted(self_numbers)
print "Sum of integers over %d ~ %d = " %(m,n-1), sum(a)
print "Sum of non-self-numbers = ",sum(b)
print "Sum of self-numbers = ", sum(a)-sum(b)

2016/02/28 16:38

Gtae

#coding: CP949
A=list(map(str,range(1,5000)))
List= []
result=[]
for i in A:
    K=int(i)
    for j in i:
        K+=int(j)
    List.append(K)
List=set(List)
A=list(range(1,5000))
for i in List:
    if i in A:
        A.remove(i)
print(A)
파이썬 3.4

2016/02/29 21:40

lovegalois2

python 3.5

def d(n):
    result = n
    for x in str(n):
        result += int(x)
    return result

total = sum([i for i in range(1, 5000)])
generator_total = sum(set([d(i) for i in range(1, 5000) if d(i)<5000]))

print(total-generator_total)

Java

import java.util.Scanner;


class Generator{

    public int generator(int num){
        String number = Integer.toString(num);
        int result = 0;
        int n;

        for(int i = 0; i < number.length(); i++){

            n = number.charAt(i);
            result += Character.getNumericValue(n);
        }

        return result + num;
      }
  }


public class Nexon{

    public static void main(String[] args){

        Generator d = new Generator();
        Scanner input = new Scanner(System.in);


        System.out.print("숫자 입력: ");
        int value = input.nextInt();

        System.out.println(d.generator(value));
    }
}

2016/03/02 20:48

Lee Seul

def generate(x):
    total = 0
    for i in range(len(str(x))):
        total += int(str(x)[i])
    total += x
    return total

if __name__ == '__main__':
    while 1:
        li = []
        last = int(input("목표 지점: "))
        for x in range(1,last):
            if generate(x)<last:li.append(generate(x))
            else:break
        print(sum(set(x for x in range(1,last))-set(li)))

파이썬 3.5.1

import java.util.*;

public class selfNumber {
    public static void main(String[] args) {
        int target = 5000;
        int result = ((target+1)*target)/2;
        HashSet<Integer> list = new HashSet<Integer>();
        for(int i = 1; i <= target; i++){
            int sum = i;
            String xS = ""+i;
            for (int j = 0; j < xS.length(); j++){
                sum += Integer.parseInt(String.valueOf(xS.charAt(j)));
            }
            if (sum<=target)
                list.add(sum);
            }
        for (Integer i:list)
            result -= i;
        System.out.println(result);
    }
}

자바

2016/03/10 16:13

Flair Sizz

int sumOfSelfNums() {
        int div = 1;
        boolean [] noSelf = new boolean[5000];
        int selfSum = 0;

        for(int n=1; n<5000; n++) {
            int sum = 0;

            while(n / div >= 10) {
                div *= 10;
            }

            int m = n;

            while(m >= 10) {
                sum += m / div;
                m = m % div;
                div /= 10;
            }
            sum += m;
            sum += n;

            if((sum >= 1) && (sum < 5000)) {
                noSelf[sum] = true;
            }
        }

        for(int i=1; i<5000; i++){
            if(noSelf[i] == false){
                selfSum = selfSum + i;
            }
        }

        return selfSum;
    }

java로 작성했습니다.

2016/03/13 03:33

mozzi

nums = range(1,5001) # Total number set 1~5000
non_selfnums=[sum([int(i) for i in str(num)]) + num for num in nums]  # non-self number set
selfnums = set(nums) - set(non_selfnums)  # (Total number set)-(non-self number set)=self number set

print(sum(selfnums))

2016/03/22 09:01

[email protected]

def generator(n):           # 제네레이터 결과값 계산
    gen_num = n
    for num in str(n):
        gen_num += int(num)
    return gen_num

def generators(n):          # 제네레이터 함수로 결과값들 리스트 만들기.
    gen_result_list = []
    for gen_num in n:
        gen_result_list.append(generator(gen_num))
    return gen_result_list

numbers = range(5001)       #범위지정
print sum(set(numbers) - set(generators(numbers))) # 차집합을 이용해서 최종결과계산 ( 범위리스트 - 제네레이터 결과값들 리스트 )

2016/03/28 02:55

알 파고

파이썬 3.4.2입니다.

def d(n):
    s = ' '.join(str(n)) # 들어온 숫자를 문자열로 변환해 사이사이에 띄어쓰기
    s = sum(list(map(int,s.split()))) # 그 문자열을 띄어쓰기를 기준으로 나눠 생성한 리스트의 각각의 성분을 정수화하고 그것을 더함 -> 각 자릿수의 합
    return s + n # 그 숫자와 원래의 숫자를 넘겨준다.

subj = set(range(1,5001)) # 1부터 5000까지의 자연수가 들어있는 집합
nonself = set() # '셀프 숫자'가 아닌 것이 들어갈 집합
for i in range(1,5001): # 1부터 5000까지
    nonself.add(d(i)) # 모두 계산한 것을 집어는다. 이때 중복이 안됨.

print(sum(subj-nonself)) # subj에서 nonself를 빼면 남는 것은 제너레이터가 없는 집합들. 이를 더해주면 된다.

2016/04/01 23:27

차우정

C#으로 작성했습니다. Hashtable을 사용했습니다.

using System.Collections;

        public int SumOfSelfNumbers(int n)
        {
            var sum = 0;
            var outputs = new Hashtable();
            for (int i = 1; i < n; i++)
            {
                var d = i/1000 + (i%1000)/100 + (i%100)/10 + i%10 + i;
                outputs[d] = i;
            }
            for (int i = 1; i <= n; i++) sum += outputs.ContainsKey(i) ? 0 : i;
            return sum;
        }

2016/04/05 08:33

Straß Böhm Jäger

이렇게 만들어 보았습니다.

https://scratch.mit.edu/projects/104753260/#editor

2016/04/10 01:02

brendy

정답이 1223023 맞나요? 아래와 같이 풀었습니다. 일단 1~5000까지 제너레이팅 한 후에, 배열에다가 각 값의 인덱스에 -1로 표기를 해서 -1 아닌 인덱스만더해서 값을 냈습니다.

   public int sumOfSelfNumber(int num) {
        int sum = 0;
        int[] result = new int[num+1];
        int d = 0;
        for(int i = 1  ; i <= num ;i++){
            d = generator(i);
            if(d <= num)
               result[d] = -1;
        }

        for(int i = 1  ; i <=num ; i++){
            if(result[i] != -1){
                sum += i;
            }
        }
        System.out.println("sum : " + sum);
        return sum;
    }
    public int generator(int num){


        int result = num;
        result += num %10;
        while(num > 10){
            num = num / 10;
            result += num % 10 ;
        }

        return result;
    }

2016/04/11 20:12

xeo

def ddn(a):                   
    ddsum=a
    for i in str(a):
        ddsum += int(i)
    return ddsum
k=set()
l=set()
sum=0
for i in range(1,5000):                       
    k.add(ddn(i))
for j in range(1,5000):
    l.add(j)
    if l.union(k) != k:
        sum += j
        l.remove(j)
print(sum)

2016/04/17 01:16

Dr.Choi

java 최신버전으로 작성했습니다. 지적 감사히 받아들이겠습니다.

class Main{
    public static void main(String[] args){
        int selfSum=0;
        int input=5000;
        for(int i=1;i<input;i++){
            boolean geneFind=false;
            String n="";
            int sum=0;
            int d=i;
            for(int j=1;j<=i;j++){
                n=String.valueOf(j);
                sum=0;
                for(int k=0;k<n.length();k++){
                    sum+=(int)n.charAt(k)-48;
                }
                if((Integer.parseInt(n)+sum)==d){
                    //System.out.println(n+"은 "+d+"의 제네레이터 입니다.");
                    geneFind=true;
                }   
            }
            if(geneFind==false){
                System.out.println(d+"는 셀프넘버이다.");
                selfSum+=d;
            }
        }
        System.out.println(input+"까지의 셀프넘버 총합:"+selfSum);
    }
}

2016/04/20 11:37

Bae Geunho

Python 3.4

bucket = set(range(1, 5000))

for n in range(1, 5000):
    bucket -= {n + sum([int(x) for x in str(n)])}

print(sum(bucket))

2016/04/28 18:59

SanghoSeo

Ruby

generator = ->n { n.digits.sum + n }
sum_of_selfnums = ->limit { ([*1..limit] - (1..limit).map(&generator)).sum }

Test

expect(generator[91]).to eq 101
expect(sum_of_selfnums[5000]).to eq 1227365

2016/05/01 18:36

rk

    final Logger logger = LoggerFactory.getLogger(CodeTest2.class);

    private Integer plus(Integer number) {
        return (number % 10) + (number >= 10 ? plus(number / 10) : 0);
    }

    private int generator(int d) {
        return d + plus(d);
    }

    @Test
    public void 각자리수의합() {
        int sum = 0;
        for(int i=1;i<5000;i++) {
            sum+= generator(i);
        }
        logger.debug("{}", sum);
    }

2016/05/04 11:54

Lee Brandon

파이썬3.5

d = lambda n: sum(int(x) for x in str(n)) + n
a = {n for n in range(1, 5000)}
b = {d(n) for n in range(1, 5000)}
print(sum(a-b))

2016/05/04 19:03

디디

파이썬 3입니다. 프로그래밍을 배운지 얼마 안되서그런지 초보티가 너무나는거같네요ㅎㅎ

def d(n):
    a=list(str(n))
    b=[]
    while a:
        b.append(int(a.pop()))
    return sum(b)+n

selfnumber=list(range(5000))

for i in range(5000):
    if d(i)>=5000:
        continue
    selfnumber[d(i)]=0

print(sum(selfnumber))

2016/05/09 09:08

징짱더럽

int _tmain(int argc, _TCHAR* argv[])
{
    int nNumberpool[5001] = {0,};
    int nNonGeneratorCountpool[5000];
    int nSum = 0;
    for (int n = 1; n <= 5000; n++)
    {
        int nFirst = n /1000;
        int nSecond = (n % 1000) / 100;
        int nTherd = (n % 100) / 10;
        int nFist = n % 10;

        int nGenerator = n + nFirst + nSecond + nTherd + nFist;

        if (nGenerator <= 5000)
        {

            nNumberpool[nGenerator]++;
        }

    }

    for (int n = 1; n <= 5000; n++)
    {
        if(nNumberpool[n] == 0)
        {
            nSum += n;
        }
    }

    cout <<nSum;

    return 0;
}

2016/05/11 13:22

유창근

n = c(1:4999)
a = sapply(n, function(x){
  tmp = x; tmp1 = c(tmp)
  for(i in 1:nchar(tmp)) tmp1[i+1] = as.integer(substr(tmp, i, i)); tmp2 = sum(tmp1)
  return(tmp2)
})

sum(subset(n, !(n %in% a)))

2016/05/18 11:47

Byun Seongjun 변성준

public static int getSumOfSelfNumbers(int maxRange){
        int sum = 0;

        LinkedHashSet<Integer> hasGenerator = new LinkedHashSet<Integer>();
        for(int num = 1; num<=maxRange; num++){
            int dn = num;
            String s = Integer.toString(num);

            for(int j = 0; j<s.length(); j++){
                dn += Integer.parseInt(s.substring(j, j+1));
            }

            hasGenerator.add(dn);
        }

        for(int num = 1; num <= maxRange; num++){
            if(!hasGenerator.contains(num)){
                sum += num;
            }
        }

        return sum; 
    }

답은 1227365

2016/05/20 16:15

남보원

def d(n):
    result = n
    for i in str(n):
        result += int(i)
    return result

mems = []
sum = 0
for j in range(1, 5000):
    if d(j) not in mems:
        mems.append(d(j))
for k in range(1, 5000):
    if k not in mems:
        sum += k
print(sum)

파이썬 3.5로 작성하였습니다.

결과값은 [1227365]가 나왔습니다.

부족한 점이 많습니다.

열심히 배우겠습니다. 감사합니다.

2016/05/24 07:09

greatfarmer

#include <stdio.h>

int generator(int n)
{
    int sum = n;
    while (n > 0)
    {
        sum += n % 10;
        n /= 10;
    }

    return sum;
}

int main()
{
    int arr[5100] = {0,};
    int sum=0;
    for (int i = 1; i <= 5000; i++)
    {
        arr[generator(i)] = true;
    }

    for (int i = 1; i < 5000; i++)
    {
        if (!arr[i])
            sum += i;
    }
    printf("합:%d\n", sum);

    return 0;
}

에라토스테네스의 체랑 비슷한 방법으로 풀었습니다

2016/05/27 00:52

김 진훈

/*brute-force search 방법으로 해결했습니다. 
시간복잡도 O(n^2) */
#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <algorithm> 
using namespace std;

bool chk(int x){
    for (int i = 1; i <= x; i++){
        int num = i; 
        int sum = 0; 
        while (num){
            sum += num%10; 
            num /= 10; 
        }
        sum += i;  
        if (sum == x) return false; 
    }
    return true; 
}

int main(){
    int sumSelf = 0; 
    for (int i = 1; i < 5000; i++){
        if (chk(i)) sumSelf += i;  
    }
    printf("%d\n",sumSelf); 
    return 0; 
}

2016/05/28 19:47

iljimae

```

include

int main(){

// 제너레이터 구하기 .  범위는 1~ 5000.
// generator ? d(91) = 1 + 9 + 91 = 101임.91을 101의 제네레이터라고함.
// 제네레이터가 없는수(셀프넘버. self Number)들이 있는데, 이 수들을 구하여라 .
int arr[5000] = {0};
int i = 0;
while(i <= 5000){
    char chList[4];
    int tmp = i;
    int result = i;
    int j = 0;
    while(j < 4){
        chList[j] = tmp%10;
        tmp/=10;

        result += chList[j];
        j++;
    }
    if(result < 5000)
        arr[result]++;
    i++;
}
i = 0;
int sum = 0;
while(i < 5000){
    if(arr[i] ==0){
        sum+= i;
    }
    i++;
}
printf("[%d]",sum);
return 0;

} ```이게 맞을진 모르겠네요 .. :(

좀더 간단하고 쉽게할수있는방법이 있을것같은데, 생각좀해봐야겠네요 ㅎㅎ

2016/05/29 16:48

김 지환

파이썬 3.5로 풀었습니다.

def d(n):
    return n + sum([int(x) for x in str(n)])

S = set(range(1, 5000))
A = set([d(n) for n in range(1, 5000)])
print(sum(S-A))

2016/05/31 23:54

Analyticsstory

def d_func(n) :
    x = n / 1000
    y = (n - (x*1000)) / 100
    z = (n - (x*1000) - (y*100)) / 10
    c = (n - (x*1000) - (y*100) - (z*10))
    result=n+x+y+z+c
    return result


A = set(range(1,5000))
B = set(d_func(n) for n in range(1,10000))
C = A-B

print sum(C)

2016/06/01 17:10

MJ

#include <stdio.h>
#define MAX 5000
#define TRUE 1
#define FALSE 0
int Self_Num(int var);

int main(void)
{
    int i, result;
    result = 0;

    for (i = 1; i < MAX; i++) {
        if (Self_Num(i) == TRUE)
            result += i;
        else
            continue;
    }

    printf("%d\n", result);
    return 0;
}

int Self_Num(int var) //Self Number을 판별하는 함수//
{
    int i, digit_sum, result, temp, flag;
    digit_sum = 0;
    flag = TRUE;

    for (i = 1; i < var; i++) {
        temp = i;

        while (i >= 10) { //각 자릿수의 합//
            digit_sum += i % 10;
            i /= 10;
        }
        digit_sum += i;

        result = temp + digit_sum; //각 자릿수 + 원래 숫자//

        if (result == var) { //결과 값이 변수와 같으면? (제너레이터가 존재하면? -> Self Number가 아니다.)
            flag = FALSE;
            break;
        }

        else {
            digit_sum = 0;
            i = temp;
            continue;
        }
    }
    return flag;
}

2016/06/03 16:02

GyuHo Han

int sum=0;
boolean[] generator = new boolean[5000];

for (int i = 1; i < 5000; i++) {
    int num = i + i%10 + i/10%10 + (i/100)%10 + i/1000%10;
    if (num<5000) generator[num] = true;
}
for (int i = 1; i < 5000; i++) {
    if (generator[i]==false) sum+=i;
}
System.out.println(sum);

2016/06/16 23:56

김 수영

package m1606;

import java.util.HashMap;

public class Test2 {

    /*
    어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.
*/

    public static void main(String[] args) {
        HashMap<Integer, Integer> genList = new HashMap<Integer, Integer>();

        int genNumber = 0;
        int iNum = 0;
        while(getGenerator(iNum) < 5000){
            genList.put(iNum, getGenerator(iNum));
            iNum++;
        }


        for(int i = 0; i < genList.size(); i++){
            if(!genList.containsValue(i)){
                System.out.println(i);
                genNumber += i; 
            }
        }

        System.out.println("genNumber : " + genNumber);

    }

    public static int getGenerator(int sNum){
        int retVal = sNum;
        String strNum = String.valueOf(sNum);

        int numlength = String.valueOf(sNum).length();
        for(int i = 0; i < numlength; i++){
            retVal += Integer.parseInt(strNum.substring(i, i+1));
        }

        return retVal;
    }

}

2016/06/20 13:19

10002

import java.util.ArrayList;

public class test {
    public static void main(String[] argv) {

        int a = 0 ;
        int x = 0 ;
        ArrayList<Integer> listGenerator = new ArrayList<Integer>();

        while(a < 5000){
            listGenerator.add(generator(a));
            a++;
        }


        for(int i = 0; i<5000; i++){
            if(!listGenerator.contains(i)){
                x += i;
            }
        }

        System.out.println(x);
    }


    public static int generator(int a){
        String tempStr = String.valueOf(a);
        int y = 0;

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

        return y+a;

    }

}

2016/06/21 17:27

이 승준

GCC

c;i;j;a[9999];main(b){for(;++i<5001;a[b]++,a[i]||(c+=i))for(b=j=i;j;j/=10)b+=j%10;printf("%d",c);}

2016/06/25 13:34

Lotion

수학적으로 풀면 매우 쉽게 해결할 수 있겠지만 C++를 많이 사용해보려고 C++의 기능을 사용해서 작성해봤습니다.

#include <iostream>
#include <string>
#include <vector>

unsigned int d_fn(int num);
int main(void) {
    std::vector<int> arr;
    unsigned int d_sum;
    bool exists;
    for (auto idx = 1; idx <= 5000; idx++) {
        d_sum = d_fn(idx);
        exists = std::find(std::begin(arr), std::end(arr), d_sum) != std::end(arr);
        if (!exists) {
            arr.push_back(d_sum);
        }
    }
    d_sum = 0;
    for (auto idx = 1; idx <= 5000; idx++) {
        exists = std::find(std::begin(arr), std::end(arr), idx) != std::end(arr);
        if (!exists) {
            d_sum += idx;
        }
    }
    std::cout << d_sum << std::endl;
}
unsigned int d_fn(int num) {
    std::string st;
    unsigned int d_sum;
    st = std::to_string(num);
    d_sum = num;
    for (auto i = 0; i < st.length(); i++) {
        d_sum += (int)(st[i] - 48);
    }
    return d_sum;
}

2016/06/26 02:12

rev


array= [True] * 5001
result = 5000 * ( 5000+1 )//2


ret = 0
temp = 0

for n in range(1, 5001) :
    temp = n
    while temp > 0 :
        ret += temp % 10
        temp = temp // 10

    ret+=n
    if n != ret and ret < 5001 and array[ret] != False:
        array[ret] = False
        result -= ret
    ret = 0

print (result)


2016/06/27 00:23

안 동환

자바로 만들어 봤어요 아직 많이 배워야 하는 단계라 정말 많이 부족한 것 같습니다.

public static void main(String[] args) {

        final int Number=5000;
        int Notgenerator =0;
        final int Number_48= 48;

        ArrayList<Integer> generator = new ArrayList<Integer>();

        for(int i =1; i<=Number; i++){

            String text = String.valueOf(i);

            switch (text.length()-1) {
            case 0:
                generator.add(((int)text.charAt(0)-Number_48) + Integer.parseInt(text)); 
                break;
            case 1:
                generator.add(((int) text.charAt(0)-Number_48) +((int)text.charAt(1)-Number_48)  +
                                Integer.parseInt(text)); 
                break;
            case 2:
                generator.add(((int) text.charAt(0)-Number_48) +((int) text.charAt(1)-Number_48)+
                                   ((int) text.charAt(2)-Number_48) + Integer.parseInt(text));
                break;
            case 3:
                generator.add(((int) text.charAt(0)-Number_48)+((int) text.charAt(1)-Number_48)+
                                   ((int) text.charAt(2)-Number_48)+((int) text.charAt(3)-Number_48) +
                                  Integer.parseInt(text));
                break;

            default:
                break;
            }
        }
        for(int j=1; j<Number;j++){
            if(!generator.contains(j)){
                Notgenerator += j;
            }
        }
        System.out.println("1이상이고 5000보다 작은 모든 셀프넘버의 합은  "+Notgenerator+" 입니다.");
    }

1이상이고 5000이하인 셀프넘버의 합은 1227365 입니다.

2016/06/29 05:24

남 철진

C# 으로 해봤습니다.

    public void Display()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        int sumresult = 0;

        for(int i = 0; i < 5000; i++)
        {
            int result = D(i+1);//0부터 for문 돌렸으니... 
            if (result == i)// 같으면 셀프넘버
                sumresult += i; //셀프넘버 더하기
        }

        sw.Stop();
        Console.WriteLine("Test(" + row + ") result is " + sumresult + " ("+ sw.ElapsedMilliseconds.ToString() + "ms)");
    }
    private int D(int n)
    {
        int su = 0;
        int sum = 0;
        int number = n;

        while (number > 0)
        {
            su = n % 10; //1의자리숫자를 구한다.
            sum += su; // 구한 1의자리 숫자를 더한다.
            number = number / 10; //10으로 나눈다. (만약 3자리였으면 2자리 다시돌면 1자리 로 될것)
        }
        sum = sum + n;
        return sum;
    }

2016/06/29 16:40

Lee JongJin

c입니다. 이론없이 무작정 돌렸습니다. 값이 나오면 flag에 1을넣고 안나오면 0을넣어서 0~MAX까지 0인것들의 index를 더했습니다.!! 초보벗어나고싶네요. 바로바로 코딩되어졌으면 좋겠네용 ㅎㅎ

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>

#define MAX 5000
int d(int n)
{

    int sum = n;
    while (n)
    {
        sum += n % 10;
        n /= 10;
    }
    return sum;

}
int generate_and_sum_self_number(bool flag[])
{
    int sum = 0;
    for (int i = 1; i < MAX; i++)
    {
        int g = d(i);
        if (g < MAX)
            flag[g] = true;
        if (flag[i] == false)
            sum += i;
    }
    return sum;
}
int main()
{
    bool flag[MAX] = { 0 };
    printf("%d", generate_and_sum_self_number(flag));
}

2016/07/03 17:50

양 상호

1~5000까지의 generated number 를 구한 후 generated number 를 제외하여 self number를 구한다. 그 후 전체 self number를 합하여 답을 낸다.

이 때, 1은 기본으로 self number에 포함합니다.

max_range = 5000
self_number = ([1])
generated_number = ([])

for i in range(1, max_range):
    k_temp = sum([int(k) for k in str(i)])+i;
    generated_number.append(k_temp);

generated_number.sort()

index_point = 0
for i in range(2, max_range):
    if i < generated_number[index_point]:
        self_number.append(i);
    elif i == generated_number[index_point]:
        index_point += 1;
        while generated_number[index_point] <= i:
            index_point += 1;

sum_self_number = sum(k for k in self_number)

print(sum_self_number)

2016/07/04 20:43

Lee Giljae

Delphi 2010

function SelfNumber(N: Integer): Integer;
var
  isSelfNo: array of boolean;
  sumOfSelfNo, k, _d, i: Integer;

  function d(k: Integer): Integer;
  var
    res: Integer;
  begin
    res := k;
    while (k <> 0) do
    begin
      Inc(res, k mod 10);
      k := k div 10;
    end;
    result := res;
  end;

begin
  SetLength(isSelfNo, N+1);
  for i := 0 to N  do // 초기화
    isSelfNo[i] := false;

  sumOfSelfNo := 0;
  k := 1;
  while (k <= N) do
  begin
    if not isSelfNo[k] then
      Inc(sumOfSelfNo, k);
    _d := d(k);
    if (_d <= N) then
      isSelfNo[_d] := true;
    Inc(k);
  end;
  result := sumOfSelfNo;
end;

2016/07/06 17:11

강 경수

Python 3.5

def d(n):
    sum=0
    s=str(n)
    for i in s:
        sum+=int(i)
    sum+=n
    return sum

list=[]
for i in range(1,5050):
    list.append(0)
for i in range(1,5000):
    list[d(i)]+=1
result=0
for i in range(1,5000):
    if list[i]==0:
        print("셀프넘버: %d" % i)
        result+=i
print("최종 셀프넘버의 합: %d" % result)

2016/07/08 17:09

왈왈

#include <iostream>

using namespace std;

int selfNumber[5000];
bool CalculateDnum(int num);

int main(void)
{
    int sum = 0;
    bool out = true;
    int idx = 1;
    for (int i = 0; i < 5000; i++)
    {
        selfNumber[i] = i;
    }
    while (out)
    {
        out = CalculateDnum(idx);
        idx++;
    }
    for (int i = 0; i < 5000; i++)
    {
        sum+= selfNumber[i];
    }
    cout << sum << endl;
    getchar();
    return 0;
}

bool CalculateDnum(int num)
{
    int tmp = num;
    int a, b, c, d = 0;
    int dNum = 0;

    a = tmp%10;
    b = tmp%100*0.1f;
    c = tmp%1000*0.01f;
    d = tmp%10000*0.001f;

    dNum = a + b + c + d + tmp;

    if (dNum >=5000)
    {
        return false;
    }
    else
    {
        selfNumber[dNum] = 0;
        return true;
    }
}

c++로 짰습니다. 처음인데 재밋네요.. 하다보면 늘겠죠....

2016/07/13 09:50

이 재화

#d(n)은 n의 각 자리수와 n 자신을 더한 수
#d(91)=9+1+91=101, d(100)=1+0+0+100=101
#셀프넘버 : d(generator)=n을 만족하는 generator가 없는 수
#1에서 5000사이의 셀프넘버의 합

def d(n):
    result=n
    string=str(n)
    for k in range(0, len(string)):
        result+=int(string[k])
    return result

#d(n)>n이 항상 성립한다.

#good은 d(n)결과값으로, 하나 이상의 제너레이터를 가지는 수
good=[]
for k in range(1, 5001):
    print('%3d : %3d' %(k, d(k)))
    good.append(d(k))
print()
good.sort()

#self는 셀프넘버 리스트
self=[]
for k in range (1, 5001):
    if k not in good:
        print(k)
        self.append(k)

answer=sum(self)
print("셀프넘버의 합은 %d" %answer)

2016/07/13 22:23

최승호

#My result code
original = 1
temp = 0
allSet=set()
tempSet=set()
sumResult=0

while temp < 5000:
    temp = 0
    copyNumber = original
    temp += copyNumber
    while copyNumber :
        temp += copyNumber%10
        copyNumber = int(copyNumber/10)
    if temp >= 5000:break
    tempSet.add(temp)
    original+=1

for i in range(1,5000):
    allSet.add(i)

result = list(allSet - tempSet)
result.sort()
print(result)

for i in list(result):
    sumResult+=i
print(sumResult)

아직 python에 익숙하지 못해서 힘드네요...

2016/07/15 14:37

지 정한

s=[]
for i in range(1,5000):
    s += [i+eval("+".join(str(i)))]
print(sum(set(range(1,5000))-set(s)))

Python 3.5.2 입니다.

2016/07/23 16:49

Zee

#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
    int max = 5000;
    int a, b, c, d;
    int sum = 0;
    int selfNumSum = 0;
    int* g = new int[5001];
    bool isGenerator[5001];
    for (int i = 0; i < 5000; i++)
    {
        isGenerator[i] = false;
    }
    for (int i = 0; i < 5000; i++)
    {
        g[i] = i + 1;
        a = (g[i] % 10000) / 1000;
        b = (g[i] % 1000) / 100;
        c = (g[i] % 100) / 10;
        d = (g[i] % 10);
        sum = g[i] + a + b + c + d;
        if (sum < 5000)
        {
            isGenerator[sum] = true;
        }
        if (isGenerator[i] == false)
        {
            if (i != 0)
            {
                selfNumSum += i;
            }
        }
    }
    cout << selfNumSum << endl;
}

2016/08/04 04:28

알라뷰

def generator(seed):

    strSeed = str(seed)
    result = seed 

    for i in range(len(strSeed)) :
        result = result + int(strSeed[i])

    return result 

def sumSelfNumer():

    dic = {}
    for i in range(1, 5001) :
        dic[i] = generator(i)

    geneList = list(dic.values())

    sum = 0

    for i in range (1, 5001) :
        if i not in geneList :
            sum = sum + i


    print(sum)




def main():
    sumSelfNumer()

if __name__ == "__main__":
    main()

2016/08/04 23:55

최일환

#include <stdio.h>

static const int nMaxNum = 5000;

int CalcGenerater(int n);
bool isGenerater(int n);

int main()
{
    int nSumIsNoSelfNum=0;
    bool bHaveGenerater[nMaxNum+32]={0};    //이부분을  bool bHaveGenerater[nMaxNum]={0}; 의 배열값으로 하면 스택오버플로나는데 왜그렇죠
    int nNum[nMaxNum]={0};


    for(int i = 1; i<=nMaxNum; i++)
    {
        nNum[i-1] = CalcGenerater(i);
        bHaveGenerater[nNum[i-1]-1] = isGenerater(nNum[i-1]);
    }

    for(int i=1; i<=nMaxNum; i++)
    {
        if(!bHaveGenerater[i-1])
            nSumIsNoSelfNum += (i);
    }

    printf("결과 : %d  ", nSumIsNoSelfNum);

    return 0;
}

int CalcGenerater(int n)
{
    return (n + (n/1000) + (n%1000)/100 + (n%100)/10 + n%10);
}

bool isGenerater(int n)
{
    if(n <= nMaxNum)
        return true;

    return false;
}

2016/08/09 16:34

표성우

python 3.5 1-5000까지의 수 집합에서 1-5000까지의 제너레이트된 수의 집합을 뺍니다. (d(n)은 항상 자기자신 n 을 더하니까 n보다 작을 수 없으므로 제너레이트된 수의 집합이 항상 많습니다)

result = list(set(range(1,5000)) - set(eval("+".join(str(i))) + i for i in range(1, 5000)))
result.sort()

print(result)

2016/08/10 16:36

정 우순

class selfnum{
    int[] zene = new int[5001];
    int sum = 0;
    int ze=0;
    selfnum(){
        for(int i = 0 ; i<5001;i++)  zene[i]=i;
        for(int i = 1 ; sum<=5000;i++){
            zene[sum]=0;
            sum=0;
            ze = i;
            sum = ze+sum;
            for(int j=0;ze>0;j++){
                sum = sum+ze%10;
                ze=ze/10;
            }
        }
        sum=0;
        for(int i = 0 ; i<5001;i++)  sum=sum+zene[i];
        System.out.println(sum);

    }
}
public class lv2_12 {
    public static void main(String[] args) {
        selfnum s = new selfnum();
    }
}

2016/08/11 02:58

김준호

자바 스크립트 입니다.

var arr = new Array(5001);

for(var i = 1; i <= 5000; i++){
    var tmpNum = i;
    var sum = i;
    while(tmpNum > 0){
        sum += (tmpNum % 10);
        tmpNum = parseInt(tmpNum / 10);
    }

    if(sum <= 5000){
        arr[sum] = 1;
    }
}

var selfSum = 0;

for(var i = 1; i <= 5000; i++){
    if(arr[i] == undefined) selfSum += i;
}

document.write("selfSum : " + selfSum);

  1. 1~5000까지 자신부터 시작해서 10의 나머지를 하나씩 더하여 해당 인덱스에 단순히 1을 채우는 구조입니다.
  2. 1이 채워지지 않은 배열이 있다면 셀프 넘버로 볼 수 있기 때문에 undefined을 체크해서 해당 인덱스의 합을 구하는 구조입니다.
  3. 자바 스크립트에서 배열의 초기값은 undefined 입니다.

2016/08/21 20:13

advocamp

def d(n):
    N = set(range(1,n))   # 1~5000 전체 집합

    C = set([ num + sum( [int(comp) for comp in str(num)] ) for num in range(1,n)])
    # 일의 자리 + 십의자리 + number의 합 집합

    result = sum(N-C)
    # 집합의 차집합이니까 N에 없는 요소는 제외된다

    return result

1~5000보다 작은경우의 결과 값은 1227365

2016/08/22 22:17

sega

처음엔 아무 감도 잡히지 않았지만 위의 풀이를 보고 풀 수 있었습니다. 그대로 배낀 것 같지만ㅋㅋ

def d(n): return n + sum([int(x) for x in str(n)])

s = set(range(5000))
z = set([d(n) for n in range(5000)])

print(sum(s-z))

2016/09/03 09:12

정석철

#include<stdio.h>
#include<stdlib.h>

struct number {
    int generator;
    int nGenerator;
};

void main(void) {
    int n = 31;
    int selfnumber;
    number* d = (number*) malloc (sizeof(number) * n+1);
    for(int i = 1 ; i <= n ; i++) 
        d[i].nGenerator = 0;

    for(int i = 1 ; i <= n ; i++) {
        d[i].generator =  i/1000 + (i%1000)/100 + (i%100) / 10 + (i%10) + i;
    }
    for(int i = 1 ; i <= n ; i++) {
        for(int j = 1 ; j<=n ; j++)
        if( i == d[j].generator)
            d[i].nGenerator ++;
    }

    for(int i = 1 ; i <= n ; i++) 
        if(d[i].nGenerator == 0 || d[i].nGenerator > 1)
            printf("%d\t", i);


}

2016/09/03 15:24

코딩초보

def generator(num):
    digit=10
    digitcnt = 1    #입력된 값의 자릿수 카운트입니다.
    numcopy = num   
    while num > digit:
        digitcnt = digitcnt + 1
        digit = digit * 10

    sum = 0
#   d(91) = 9 + 1 + 91 = 101    계산하는 과정입니다.
    for i in range(0,digitcnt+1):
        sum= sum+num // digit
        num = num - num//digit*digit
        digit = digit / 10
    return sum+numcopy

num=[0]*5000    
sum =0
for i in range(0,5000):
    idx = generator(i)
    if idx <5000:
        num[idx]=1      #제네레이터를 체크합니다.

for i in range(1,len(num)):
    if num[i]==0 :  #SELF_NUMBER 확인하여 더합니다.
        sum = sum +i

2016/09/06 10:01

도르르

자바

package study;

public class study {

    public static void main(String[] args) {
        System.out.println(solve(5000));
    }

    public static int solve(int n){
        int i, j, sum=0;

        for(i=1; i<n; i++){
            for(j=1; j<i; j++){
                int k=j+(j%10)+(j/10)%10+(j/100)%10+(j/1000)%10;
                if(k==i){
                    break;
                }
            }

            if(j==i){
                sum+=i;
            }
        }
        return sum;
    }
}

2016/09/08 18:15

JD

#include <stdio.h>

int d(int n){
    int s = 0;
    s += n;
    while(n > 0) {
        s += (n % 10);
        n = n / 10;
    }
    return s;
}

int main(){
    int a[5000];
    int dn = 0, s = 0;
    for(int i = 1; i < 5000; i++){
        a[i] = 0;
    }
    for(int i = 1; i < 5000; i++){
        dn = d(i);
        if(dn < 5000){
            a[dn] = 1;
        }
    }
    for(int i = 1; i < 5000; i++){
        if(a[i]==0){
            s += i;
        }
    }
    printf("%d",s);
}

2016/09/08 23:52

이 종성

한 줄에 마치신 분도 있고, 대박 신세계네요!!! 퇴근하고 틈틈이 책으로 파이썬을 배우고 있는데 많이 배우고 싶습니다. 잘 부탁드립니다.

n_number = list(range(1,5000))
reference = n_number[:]
for i in reference:
    digit_number = len(str(i))
    de_generator = 0
    for j in range(digit_number):
        de_generator += eval(str(i)[j])
    else:
        de_generator += i

    if de_generator in n_number:
        n_number.remove(de_generator)
    else:pass
n_number_sum = 0
for i in n_number:
    n_number_sum += i
    # print(n_number_sum)
print("The sum is",n_number_sum)

2016/09/17 11:49

신 명진

결과값은 1227365가 나왔어요 조금은 무식하게 짠거 같네요..

#include <stdio.h>

int main(void)
{
    int i = 0;
    int result = 0;
    int sum = 0;
    int num[5000]= {0,};

    for(i=0; i<5000; i++){
        num[i] = i+1;
    }

    for(i=0; i<5000; i++){
        result = d(i);
        printf("d(%d)  = %d \r\n", i, result);

        if((result < 5001) && (result != 0)){
            num[result-1] = 0;
        }
    }


    for(i=0; i<5000; i++){
        sum += num[i];
    }

    printf("sum  = %d", sum);

    return 0;
}


int d(int a){

    int result = a;
    int num = a;

    while(num != 0){
        result += num%10;
        num = num/10; 
    }

    return result;
}

2016/09/20 09:45

Jeon Jihyeon

def chkSelfNum(chkNum, period):
    trueFalse = True

    for num in range(1,(period+1)):
        if num > chkNum:
            break

        digit = len(str(num))
        sum = 0 
        for n in range(digit):
            sum = sum + int(str(num)[n])

        sum = sum + num 

        if sum == chkNum:
            trueFalse = False
            break

    return trueFalse

def main():
    selfNum = []
    for num in range(1,5000+1):
        if chkSelfNum(num, 5000) == True:
            selfNum.append(num)

    print("selfnumber are : ", selfNum)



if __name__ == '__main__':
    main()

2016/09/28 13:23

Son Earnest hyunsu

간단하게 구현해보았습니다. 시간복잡도는 o(k*n)

public class FindSimpleNumber {
    private boolean[] hasGenerator;
    private final int MAX = 5000;

    public FindSimpleNumber() {
        this.hasGenerator = new boolean[MAX+1];
    }

    public int getSimpleNumberSum(){
        int sum = 0;
        for(int i=0; i<=MAX; i++){
            if(!hasGenerator[i]){
                sum+=i;
            }
            hasGenerator[isGenerator(i)] = true;
        }
        return sum;
    }
    private int isGenerator(int number){
        int result = number;
        while(number>0){
            result += (number%10);
            number/=10;
        }
        return result>MAX?0:result;
    }
}

2016/10/06 22:54

한인규(Hayden)

Java 풀이입니다.

import java.util.ArrayList;

public class SelfNumber {

    public static void main(String[] args) {

        long start = System.currentTimeMillis();

        int n = 5000;

        ArrayList<Integer> selfNumbers = new ArrayList<>();
        for(int i = 1; i< n; i++){
            selfNumbers.add(i);
        }

        for(int i = 0; i < n; i++){
            int nonSelfNumber = d(i + 1);
            if(nonSelfNumber < n){
                Boolean res = selfNumbers.remove((Object)(nonSelfNumber));
            }
        }

        int sum = 0;
        for(int sn : selfNumbers){
            sum += sn;
        }

        System.out.println("sum : " + sum + ", time : " + (System.currentTimeMillis() - start) + "ms");
    }

    public static int d(int generator){
        int res = generator;
        while(true){
            res += generator % 10;
            if(generator / 10 == 0){
                break;
            }
            generator = generator / 10;
        }

        return res;
    }

}

2016/10/07 23:47

이 정현

#include <iostream>

inline int d(int n)
{
    int generator = n;

    while (n > 0)
    {
        generator += n % 10;
        n /= 10;
    }
    return generator;
}

int main(void)
{
    bool isSelfNumber[5000];
    int sum = 0;

    std::fill_n(isSelfNumber, 5000, true);

    for (int i = 1; i < 5001; i++)
    {
        int d_ = d(i);
        if(d_ <5000)
            isSelfNumber[d_] = false;
    }

    for (int i = 1; i < 5001; i++)
    {
        if (isSelfNumber[i])
            sum += i;
    }

    std::cout << sum << std::endl;
    return 0;
}

2016/10/10 04:52

Park Jangsu

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
#include <windows.h>
#include <stdio.h>
#include <string>

#define MAX 5000

using namespace std;


int main(void) {
    int ary[MAX] = { 0, };
    int i,n, gen, tself = 0;

    for (i = 0; i < MAX; i++) {
        ary[i] = i;
    }

    for (i = 0; i < MAX; i++) {
        n = i;
        gen = 0;
        while (n) {
            gen += n % 10;
            n = n / 10;
        }
        gen += i;
        if (gen < MAX) {
            ary[gen] = 0;
        }
        //generator을 찾아 0으로 ~
    }

    for (i = 0; i < MAX; i++) {
        tself += ary[i];
    }

    printf("total sum of selfnum : %d\n", tself);

    system("pause");
    return 0;

}

2016/10/10 13:25

개허접

#include <stdio.h>

#define MAX_N 11111
int chk[MAX_N];
int f(int x){
    int ret = x;
    while(x){
        ret += x % 10;
        x /= 10;    
    }
    return ret;
}
int main(){
    int i, sum=0;
    for(i=1;i<=5000;i++) chk[f(i)] = 1;
    for(i=1;i<=5000;i++) if(!chk[i]) sum+=i;
    printf("%d\n", sum);
    return 0;
}

채점해보고 싶네요..

2016/10/11 17:57

Lee Seungchul

파이썬

def selfNum(n):
    return(n + sum([int(i) for i in str(n)]))

print(sum(set(range(5000)).difference(set([selfNum(n) for n in range(5000)]))))

2016/10/19 09:32

훠니

Python 코드입니다.

All = [x for x in range(1,5001)]
gen = []

def generator(n):
    return (n + n//1000 + (n//100)%10 + (n//10)%10 + n%10)

for i in All:
    if generator(i) in All:
        gen.append(generator(i))

for i in gen:
    if i in All:
        All.remove(i)

print(sum(All))

파이썬 초보입니다. 많은 피드백 부탁드립니다!!

2016/10/19 17:28

조 우성

import java.util.ArrayList;

public class Nexon {

    static ArrayList<Integer> generatorList = new ArrayList<Integer>();

    public static void main(String[] args) {

        for(int i=1; i<5000; i++){
            int number = 0;
            String[] selfNumber = Integer.toString(i).split("|");
            for(int j=0; j<selfNumber.length; j++){
                number += Integer.parseInt(selfNumber[j]);
            }

            number = number + i;

            generatorList.add(number);

        }

        int sum = 0;

        for(int i=1; i<5000; i++){
            if(!generatorList.contains(i)){
                System.out.println(i);
                sum = sum + i;
            }

        }

        System.out.println(sum);

    }
}

2016/10/21 15:29

???

import java.util.ArrayList;
import java.util.List;

public class nex1 {
    public void save()
    {
        int i=1;
        int sum = 0;
        List<Integer> ExrtaList = new ArrayList<Integer>();
        while(i<5000)
        {
            for(int j=0;j<i;j++)
            {

                int a1000 = j/1000;
                int a100 = (j-(a1000*1000))/100;
                int a10 = (j-(a1000*1000)-(a100*100))/10;
                int a1 = (j-(a1000*1000)-(a100*100) - (a10*10));
                if(i==(j+a1000+a100+a10+a1))
                {
                    if(ExrtaList.indexOf(i)==-1)
                    {
                        ExrtaList.add(i);
                    }
                }                   
            }       
            i++;
        }
        i=1;
        while(i<5000)
        {
            if(ExrtaList.indexOf(i)==-1)
            {
                sum+=i;
            }
        }
    }
}

2016/10/25 17:04

Leehyosin

#include <iostream>

using namespace std;

int d(int a) {

    int result = a;
    int num = a;

    while (num != 0) {
        result += num % 10;
        num = num / 10;
    }

    return result;
}

int main(void)
{
    int list[5000] = { 0, };
    int sumList = 0;
    int sum = 0;

    for (int i = 0; i < 5000; i++)
    {
        if (d(i) < 5000) 
        {
            list[d(i)] = d(i);
        }       
    }
// 0으로 초기화된 리스트에서 제네레이터를 보유한 숫자의 배열만 골라서 제네레이터를 보유한 숫자를 값으로 부여합니다. 
// 중복은 덮어씌워집니다.

    for (int i = 0; i < 5000; i++)
    {
        sumList += list[i];
    }
// 전체 배열을 합산합니다. 제네레이터를 보유한 숫자가 아니면 0 이기때문에 반영되지 않습니다. 

    for (int i = 0; i < 5000; i++) 
    {
        sum += i;
    }
// 전체 숫자를 합산합니다. 

    cout << sum-sumList << endl;


    return 0; 
}

앞서 작성하신 코드를 보고 나름대로 이해해보고 작성해봤습니다. 결과는 1227365로 나왔는데 결과에 끼워맞춰진거는 아닌지 불안하네요. C++ 입니다.

2016/10/28 08:50

넛크래커

Number = range(1,5000)
unselfies = []

def d(n):
    result = sum(list(map(int, str(n)))) + n
    return result

n = 0
while d(n) < 5000:
    result = d(n)
    n = n+1
    unselfies.append(result)


selfies = [x for x in list(Number) if x not in unselfies]
print(sum(selfies))

Python 3.5.2

2016/10/28 19:52

Kim J.S.

Java

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.function.IntUnaryOperator;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SelfGeneratorTest {

    public static void main(String[] args) {
        IntUnaryOperator getGen = i -> i + Arrays.stream(String.valueOf(i).split("")).mapToInt(Integer::parseInt).sum();
        Map<Integer, Long> genMap = IntStream.rangeClosed(1, 5000).map(getGen).boxed().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        System.out.println(IntStream.rangeClosed(1, 5000).filter(i -> !genMap.containsKey(i)).sum());
    }
}

1227365

2016/10/29 00:43

compert

public static void main(String[] args)
    {
        int k=0;
        int[] pass = new int[5000];
        int pw2=0;
        int pw1=0;
        int count=0;
        int num_hap=0;
        for (int num = 1 ; num < 5000 ; num++)  //1부터 4999 사이의 제너레이터를 가질 수 있는 수 구하기
        {
            int sum = 0;
            String num_c = "" + num;

            if (num_c.length() == 1) sum = num+num;
            if (num_c.length() == 2) sum = num+ (num/10) + (num%10);
            if (num_c.length() == 3) sum = num+ (num/100)  +(num/10)%10 + (num%10);
            if (num_c.length() == 4) sum = num+ (num/1000) + (num/100)%10  +(num/10)%100%10 + (num%10);

            if (sum < 5000) //제너레이터를 가질 수 있는 수가 5000미만이면 pass배열에 값을 차례대로 저장
            {
                pass[k] = sum;
                k++;
            }

        }
        for (int j1 = 0; j1 <=k ; j1++) //중복되는 값 빼주기
        {
            for (int j2 = 0; j2 <=k ; j2++)
            {
                if (pass[j1] == pass[j2]) 
                {
                    count++;
                    if (count == 2) {pass[j1] = 0; count = 1;}
                }

            }
            count = 0;  
            pw2 = pw2 + pass[j1];
        }

        while (num_hap < 5000) // 1부터 4999까지 더하기
        {
            pw1 = pw1 + num_hap;
            num_hap++;
        }   
        System.out.println(pw1-pw2); //4999까지의 합 - 제너레이터를 가질 수 있는 수의 합(답)
    }

거의 스파게티 코딩 수준..

2016/10/30 16:56

정 다솔

Python

num_list=list(range(1,5001))
tot=0
for i in range(1,5001):
    num_list.append(i)
for i in range(1,5001):
    gen_num=0
    for j in range(len(str(i))):
        gen_num+=int(str(i)[j])
    gen_num+=i
    if gen_num in num_list:
        num_list.remove(gen_num)
for i in range(len(num_list)):
    tot+=num_list[i]
print(tot)

2016/11/01 20:30

ㅇㅇㅅ

temp = 0
arr = [0 for _ in range(5001)]
for i in range(1, 5001):
    sum_v = 0
    temp = i
    while temp >= 10 :
    sum_v += temp % 10
    temp = temp / 10
    sum_v += temp
    sum_v += i

    if sum_v >= 5000: continue
    arr[sum_v] += 1

sum_v = 0
for i in range(1, 5000):
    if arr[i] == 0:
    sum_v += i

print sum_v

2016/11/02 17:12

바바

5000까지의 Generator을 구하여 Set에 넣고, Set에 없는 수만 더하는 방식으로 풀었습니다.

결과는 1227365

import static org.junit.Assert.assertEquals;

import java.util.Set;
import java.util.TreeSet;

import org.junit.Test;

public class SumSelftNumber {

    public static void main(String[] args) {
    }

    public int sumSelftNumber(final int n) {
        Set<Integer> set = new TreeSet<>();

        for(int i = 1; i < 5000; i++) {
            int sum = i;
            int num = i;

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

            set.add(sum);
        }

        int sumOfSelfNumbers = 0;

        for(int i = 1; i < 5000; i++) {
            if(!set.contains(i))
                sumOfSelfNumbers += i;
        }

        return sumOfSelfNumbers;
    }

    @Test
    public void testSumOfSelfNumbers() {
        assertEquals(1227365, sumSelftNumber(5000));
    }
}

2016/11/03 14:30

한비타

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

int sum = 0;
for (int i=1; i<5000; i++) {
  if (selfNumber(i)) {
    sum += i;
  }
}
printf("%d\n", sum);

제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)

int selfNumber(int n) {
    return countGenerators(n) == 0;
}
int countGenerators(int n) {
    int count = 0;
    for (int i=0; i<n; i++) {
        if (generate(i) == n) {
            count++;
        }
    }
    return count;
}

d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자. n을 d(n)의 제네레이터(generator)라고 한다.

int generate(int n) {
    return n + sumDigits(n);
}
int sumDigits(int n) {
    int sum = 0;
    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

2016/11/03 21:33

Han Jooyung

public class Main {

    public static void main(String[] args) {
    // write your code here
        int sum = 0;
        for (int i=1 ; i <= 5000; i++){
            if (isSelfNumber(i)){
                sum += i;
            }
        }
        System.out.println(sum);
    }

    private static boolean isSelfNumber(int i){
        for (int j=1; j <= i; j++){
            if (j+sumNumber(j) == i){
                return false;
            }
        }
        return true;
    }

    private static int sumNumber(int i){
        int sum = i % 10;
        if(i >= 10){
            sum += sumNumber(i / 10);
        }
        return sum;
    }
}

2016/11/05 14:18

강 우민

def tolist(int):
    string =str(int)
    mlist = []
    for i in range(0, len(string)):
        mlist.append(string[i:i+1])
    return mlist

list = list(range(1,5000))
result = 0
for i in range(1,5000):
    temp = 0
    for j in tolist(i):
        temp += int(j)
    temp += i
    try:list.remove(temp)
    except: pass
for i in list :
    result += i
print(" 셀프 넘버의 합 :", result)

2016/11/09 18:08

문 성현

def d(n):
    result = 0
    for i in str(n):
        result += int(i)
    return result+n

numbers = list(range(1,5000+1))

for i in range(5000):
    if d(i) in numbers:
        numbers.remove(d(i))
sum = 0
for x in numbers:
    sum += x
print(sum)

2016/11/11 20:52

Makery

package practice_2; import java.util.ArrayList;

public class Practice_2 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    boolean[]sample = new boolean[5000];
    ArrayList<Integer> generatedNumber = new ArrayList<Integer>();
    ArrayList<Integer> results = new ArrayList<Integer>();
    Generator gene = new Generator();
    int sum = 1;

    //1. init sample
    for(int i = 0; i<5000; i++){
        sample[i]= false;
        generatedNumber.add( gene.sumNum(i+1));
    }
    //2.compare;
    for(int i = 1; i < 5000; i++){  
        if( generatedNumber.get(i-1)>4999){
            break;
        }
        sample[generatedNumber.get(i-1)] = true;
    }

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

}

import java.util.ArrayList;

public class Generator {

public int sumNum(int n){
    int dn=0;
    int origin = n;
    int numSize = 1;  //자릿수
    int initDivSeed = 1;
    int subSum = 0;

    //1. n의 자릿수 구하기
    for (int i = 10; i<=n; i = i*10){
        numSize++;
    }

    //2. 첫 seed 구하기
    for (int i = 1; i<numSize; i++){
        initDivSeed = initDivSeed * 10;
    }

    //3.나누면서 합계구하기
    for(int i = initDivSeed ; i> 0;i = i/10 ){
        subSum += n /i;
        n = n - (n/i * i);
    }

    //4.total dn구하기
    dn = subSum + origin;

    return dn;


}

}

답은 1227366 나왔습니다.

2016/11/12 21:59

Kim Joosang

static void Main(string[] args)
{
    List<int> list      = new List<int>();
    List<int> self_list = new List<int>();
    for (int i = 1; i <= 5000; i++)
    {
        list.Add(i);
        self_list.Add(i);
    }

    foreach(int x in list)
    {
        var gen = Generator(x);
        if (list.Contains(gen))
            self_list.Remove(gen);
    }

    var sum = self_list.Sum();

    Console.WriteLine(sum);
}

static int Generator(int x)
{
    string[] value = x.ToString().ToCharArray().Select(z => Convert.ToString(z)).ToArray();

    int result = 0;
    for (int i=0; i< value.Length; i++)
    {
        if(!string.IsNullOrEmpty(value[i]))
        {
            result += Convert.ToInt32(value[i]);
        }
    }

    return (result += x);
}

숫자를 문자배열로 바꿔서 더하고, 제너레이트인것들을 리스트에서 제외하고 합을 구해봤습니다. 어렵네요.

2016/11/17 16:21

Kim Sophia

JAVA로 작성했습니다.

SelfGenerator 의 총 합은 1227365 이네요.

package Questions;

import java.util.ArrayList;

public class SumSelfGenerator {

    public static void main(String[] args) {

        Generator generator = new Generator();

        int startNum = 1;
        int endNum = 5000;
        int sumOfGen = 0;

        ArrayList<Integer> numArr = new ArrayList<Integer>(); 

        //1~5000 까지 배열에 저장.
        long lStartTime = System.currentTimeMillis();

        for (int i = startNum; i < endNum; i++) {
            numArr.add(i-1, i);
        }

        //d(1) ~ d(5000)  => 값을 계산해서 나오는 값을 찾아서 삭제
        for (int i = startNum; i < endNum; i++) {
            int n = generator.calcGen(i);
            if (numArr.contains(n)) {
                numArr.remove(numArr.indexOf(n));
            }
        }

        //나머지 배열의 값을 Sum
        for (int i = 0; i < numArr.size(); i++) {
            sumOfGen += numArr.get(i);
        }
        long lDuration = System.currentTimeMillis() - lStartTime;
        System.out.println(String.format("Elapsed Time: %.3f seconds", lDuration/ 1000.0f));
        System.out.println(String.format("Sum of SelfGenerator Numbers: %d", sumOfGen));

    }
}

final class Generator {

    public Generator()  {

    }

    public int calcGen(int num) {
        String str = String.valueOf(num);

        int ret = 0; 
        for (int i = 0; i < str.length(); i++)  {
            String token = String.format("%s", str.charAt(i));
            ret += Integer.parseInt(token);
        }

        return ret + num;
    }
}

2016/11/18 22:48

Lee Kyounghee

def f(n): 
    li = []
    li.append(int(n/1000))
    li.append(int(n/100)-10*int(n/1000))
    li.append(int(n/10)-10*int(n/100))
    li.append(n%10)
    return li

def d(n):
    s = n
    for i in range(4):
        for j in range(1, 10):
            if j == f(n)[i]:
                s += j
    return s

def test(n):
    for i in range(n-36,n):
        if n == d(i):
            return False
    return True

a = 0
for n in range(1, 5000):
    if test(n):
        a += n
        print("셀프 숫자:%s        합: %s" % (n, a))

2016/11/19 19:36

fdn

a = [0 for _ in range(5000)]
sum = 0
for i in range(1, 5001):
    temp_string = str(i)
    sum = 0
    for string in temp_string:
       sum = sum + int(string)

    sum = sum + i
    if sum > 5000:
        continue

    a[sum - 1] = a[sum - 1] + 1

sum = 0
for i in range(5000):
    if a[i] == 0:
        sum = sum + (i + 1)

print sum

2016/11/20 18:34

Kwon Sunghyun

Stopwatch sw = Stopwatch.StartNew();
int SIZE = 4999;
Func<int, int> generator = (n) => (n.ToString().Sum(k => Convert.ToInt32(k.ToString()))) + n;
int[] nonselfnum = Enumerable.Range(1, SIZE).Select(k => generator(k)).Distinct().ToArray();
int selfnumSum = Enumerable.Range(1, SIZE).Where(k => !nonselfnum.Contains(k)).Sum();
sw.Stop();
Console.WriteLine($"Elapsed MillSecond : {sw.ElapsedMilliseconds}, Value : {selfnumSum}");

Elapsed MillSecond : 24, Value : 1227365

2016/11/23 04:23

lee jaekyoon

C로 작성```{.cpp}

include

int main(void) { int range, tot, i, j, set, storage, temporary;

range = 5000;
tot = 0;
storage = 0;
temporary = 1;

for (i = 1; i <= 5000; i++)
{
    temporary = 1;

    for (j = 1; j <= i; j++)
    {
        set = j;
        storage = 0;

        while (set > 0)
        {
            storage += set % 10;
            set /= 10;
        }
        if (i == storage + j)
        {
            temporary = -1;
            break;
        }
    }
    if (temporary == 1)
    {
        tot += i;
    }
}
printf("%d", tot);

return 0;

}

```

2016/11/25 22:14

CodingMan

def d(x):
    Number_str = str(x)
    result = 0
    for x in Number_str:
        result += int(x)
    result += int(Number_str)
    return result


def is_Non_self_Number(Number):
    is_Non_self_Number = False
    for x in range(1,Number):
        if (d(x) == Number):
            is_Non_self_Number = True
            break
    return is_Non_self_Number

result = 0
for a in range(1, 5000):
    if (is_Non_self_Number(a) == False):
        result += a
result

2016/11/26 17:00

유정민

파이썬 3.4.4 예전에 파이썬 하다가 입대하느라 못했는데 다시 입대후에 연습하고있습니다. 파이썬의 특징 간결함을 더욱 살리기위해 더 노력해볼생각입니다. 18/02/22

def find_func(x):
    tmp = 0
    for y in range(0,len(x)):
        tmp += int(x[y])
    tmp += int(x)

    return tmp

dic_x = dict()
dic_x = {x:find_func(str(x)) for x in range(1,5000) }

result = 0
for a in range(1,5001):
    if a in dic_x.values():
        pass
    else:
        result += a

print(result)

2016/11/26 23:16

GunBang

print(sum(set(range(1, 5000)) - set([sum(map(int, str(x))) + x for x in range(1, 5000)])))

Python 3.5.2에서 작성하였습니다.

2016/12/01 15:39

Yeo HyungGoo

sum(set(range(1,5000)) - {x+sum([int(a) for a in str(x)]) for x in range(1,5000)})

2016/12/06 18:11

심 우윤

MATLAB으로 작성하였습니다.

A = 1 : 5000;
B = zeros(1, 5000);

for x = 1 : 5000
    sum1 = 0;
    t = num2str(x);
    for n = 1 : length(t)
        sum1 = sum1 + str2double(t(n));
    end
    B(x) = sum1 + x;
end

sum(setdiff(A, B))

ans = 1227365

2016/12/07 17:18

조현우

def generated(num):

strNum = str(num)    
strlen = len(strNum)

ret = 0
if strlen <= 1:
    ret = num+num
else:     
    ret = num;
    for x in range(0, strlen):      
        ret = ret + int(strNum[x])

return ret

if name == "main":

selfList = []
for ii in range(1, 5000):
    generatedNum = generated(ii)
    selfList.append(generatedNum)

selfList.sort()

tt = 0
for ii in range(1, 5000):
    if not ii in selfList :     
        tt = tt + ii

print("self number total : %s" % tt)

2016/12/14 14:30

public class Ex_1 {
    public static void main(String[] args) {
        SelfNumber s = new SelfNumber(5000);    // 1 ~ 지정한 숫자 보다 작은 셀프 넘버의 합계 구하기
        System.out.println(s.SelfNumber());
    }
}

class SelfNumber {
    static int n;

    // 1. 생성자를 통해 시작값과 끝값 초기화
    public SelfNumber(int n){
        this.n = n;
    }

    int SelfNumber() {
        int[] gener = new int[n-1];     //gener를 담기위한 배열
        int[] self = new int[n-1];      //셀프넘버를 담기위한 배열
        int sum = 0;                    // 셀프넘버의 합을 더할 변수

        //1부터 끝값까지 모든 수의 gener를 구해 저장
        for (int i = 1; i < n; i++) {
            gener[i-1] = play(i);
        }

        //gener에 담긴 값 중 n보다 작은 애들만 self배열에 1의 값을 넣는다. gener로 나온 숫자와 안나온 숫자를 구분하기 위함
        for (int i = 0; i < self.length; i++) {
            int num = gener[i];
            if (num<n) {
                self[num-1] = 1;
            }else{
                continue;
            }
        }
        //self배열에 값이 0이면 나오지 않은 숫자이므로 sum배열에 더한다.
        for (int i = 0; i < self.length; i++) {
            if (self[i]==1) {
                continue;
            }else if(self[i]==0){
                sum+=(i+1);

            }
        }

        return sum;
    }

    //generator를 구하는 방법 : 각 자리의 수 + 자기자신 구하기
    int play(int n) {
        int sum = n + (n % 10);
        while (n >= 10) {
            n = n / 10;
            sum += n % 10;
        }
        return sum;

    }

}

2016/12/14 21:36

bbubbush

selfnum = []
s2 = set()

for i in range(1,1000):
    s2.add(i)
    #print(s2)

for i in range(0,10000):
    chk = str(i)
    chk_sum = 0
    for j in range(0,len(chk)):
        chk_sum = chk_sum + int(chk[j])     
    chk_sum = chk_sum + i
    selfnum.append(chk_sum)

s1 = set(selfnum)
print(s2 -s1)

풀이방법 - 제네레이터로 생성되는 숫자를 모두 구함 - 1~1000까지의 집합에서 생성된 숫잡 차집합

결과값 - {512, 1, 514, 3, 5, 7, 9, 525, 20, 536, 31, 547, 42, 558, 53, 569, 64, 580, 75, 591, 86, 602, 97, 613, 615, 108, 110, 626, 121, 637, 132, 648, 143, 659, 154, 670, 165, 681, 176, 692, 187, 703, 198, 714, 716, 209, 211, 727, 222, 738, 233, 749, 244, 760, 255, 771, 266, 782, 277, 793, 288, 804, 299, 815, 817, 310, 312, 828, 323, 839, 334, 850, 345, 861, 356, 872, 367, 883, 378, 894, 389, 905, 400, 916, 918, 411, 413, 929, 424, 940, 435, 951, 446, 962, 457, 973, 468, 984, 479, 995, 490, 501}

2016/12/16 12:03

김 휘겸

A = range(1,5000)
B = []
for i in A:
    dn = 0
    for j in list(str(i)):
        dn += j
    dn += i
    B.append(dn)

C = []
for i in A:
    if i not in B:
        C.append(i)

S = 0
for i in C:
    S += i

print(S)
>>>1227365

2016/12/23 11:18

최정진

C로 풀었습니다. 어떻게 하면 더 효율적으로 self number인지를 테스트 할 수 있는지가 관건인 것 같은데 이렇게 무식하게 밖에 생각을 못해서, 조금 더 고민을 해봐야 할 것 같습니다.

#include <stdio.h>


// self number test
int isSelf(int target);
// 문제에서 제시된 d(n)
int d(int n);
// 자리수 합 구하는 함수
int permute(int n);


int main(void)
{
    int sum = 0;
    for(int i = 1; i < 5000; i++)
    {
        sum += isSelf(i) * i;
    }
    printf("Result = %d\n", sum);
    return 0;

}

int isSelf(int target)
{
    for(int i = 1; i < target; i++)
    {
        // if generator exist
        if(d(i) == target)
        {
            return 0;
        }
    }
    return 1;
}

inline int d(int n)
{
    return n + permute(n);
}

int permute(int n)
{
    if(n < 10)
        return n;
    else 
    {
        return n % 10 + permute(n / 10);
    }
}

2016/12/28 17:17

김 태범

#include<iostream>
using namespace std;

void main() {
    int count = 1, X, Y, sum = 0;
    int self_number[5000] = { 0, };
    int result = 0;
    while (count < 5000) {
        X = count;
        sum = X;
        count++;
        while (X != 0) {
            Y = X % 10;
            X = X / 10;
            sum += Y;
        }
        if (sum < 5000)
            self_number[sum - 1] ++;
    }

    for (int i = 0; i < 5000; i++) {
        if (self_number[i] == 0) {
            cout << i + 1 << "  ";
            result += i + 1;
        }
    }
    cout <<endl << result;
}

아...5000보다면 5000이 안들어가는건가요...?? 1232365 이 나와버리네요....크 ㅋㅋ어떻게 빼야되지...

2016/12/28 22:03

분당의아들

요구사항은 4999이하의 값인데 self_number는 5000까지 등록하시고 4999는 이용하지 않으셔서 0으로 초기화된 채로 더해지기 때문에 잘못된 결과가 됩니다. [4999]를 이용하도록 sum - 1에서 -1을 제거하거나, 처음 배열 생성시 4999로 생성하는 방법이 있겠네요 - 박진규, 2017/01/31 09:31

아름다운 코드군요 , 윗분의 답을 많이 참조했습니다 . 참고로 이건 답이 아닙니다 연습용으로 올림!

if __name__ == '__main__':
    print sum(set(range(1,5000)) -  set( x + sum([int(y) for y in str(x)]) for x in range(1,5000) ))
    #{x + sum([int(a) for a in str(x)]) for x in range(1, 5000)}



2016/12/29 01:03

Daniel

numbers = range(1, 5000)

k = 0

for i in range(1, 5000):

    for j in str(i):

        k = k + int(j)

    k = k + i

    try:
        numbers[k-1] = 0
    except:
        pass

    k = 0

for i in numbers:
    k = k + i

print k

파이썬으로 작성했습니다.

2017/01/03 12:55

K

package codingdojang;

import java.util.HashSet;

public class Number1 {

    public static void main(String[] args) {

        HashSet<Integer> numbers = new HashSet<Integer>();

        for ( int i = 1 ; i < 5000 ; i++ )
            numbers.add(i);

        for ( int i = 1 ; i < 5000 ; i++ )
            numbers.remove(generate(String.valueOf(i)));

        int sum = 0;

        for ( int i : numbers )
            sum += i;

        System.out.println(sum);

    }

    private static int generate(String number) {

        int k = 0;

        for ( int i = 0 ; i < number.length() ; i++ ) {

            k += Character.getNumericValue(number.charAt(i));

        }

        k += Integer.parseInt(number);

        return k;

    }

}

자바로 작성했습니다.

2017/01/03 13:50

K

$max = 4999;
$array = range(0,$max);

for($num=1;$num<=$max;$num++){
    $array_num = str_split($num);
    $sum = 0;
    foreach($array_num as $val){
        $sum += $val;
    }
    $sum += $num;
    unset($array[$sum]);
}
unset($array[0]);
foreach($array as $num) $total_sum += $num;
echo sprintf("total count:%s",count($array));
echo "\n";
echo sprintf("total sum:%s",$total_sum);

2017/01/04 17:35

stardust


#include <stdio.h>

int Number (int n, int *cnt);
int Generator (int n);

int main(void)
{
    int n=0,i,dn=0;
    int arr[5001] = {0};
    int sum=0;

    for(n=0 ; dn<=5000 ; n++) {
    dn = Generator(n);
    arr[dn] = 1;    

    }

    for(n=0;n<=5000;n++)
    {
        if(arr[n] == 0)
            sum+=n; 
    }
    printf("셀프넘버들의 합은 %d",sum);      //정답 : 1227365 출력
    return 0;
}

int Generator (int n)
{
    int dn = 0,num;
    int i,cnt=0;
    int ten=1;
    num = Number(n,&cnt);

    while(num>=0)   {
        for(i=1;i<num;i++)
            ten*=10;
        dn += (n/ten) % 10;
        num--;
        ten=1;
        if(num ==0) {
            dn += n;
            break;
        }
    }
    return dn;
}

int Number (int n, int *cnt)
{
    int number;
    number = n/10;
    if(number == 0){
        *cnt+=1;
        return *cnt;
    }
    else{
        *cnt+=1;
        Number(number,cnt);
    }
}   

c언어로 작성해봤습니다. 어렵네요

2017/01/05 23:40

김종현

import java.util.ArrayList;
import java.util.Arrays;

public class SelfNumber {
    static int sum;
    public static void main(String[] args) {

        ArrayList<Integer> list = new ArrayList<Integer>();

        int finishNum = 5000;
        for(int i = 1; i < finishNum; i++){
            list.add(i);
        }
        for(int i = 1; i < finishNum; i++){
            list.remove((generateNum(i)<finishNum)?generateNum(i):false);
        }

        list.stream().forEach((i) -> {
            sum += i;
        });

        System.out.println(sum);
    }

    private static int generateNum(int i) {
        int gab = 0;
        if(i < 10){
            gab +=  (i-(i/10)*10)/1;
        } else if(i < 100){
            gab +=  (i-(i/100)*100)/10 + (i-(i/10)*10)/1;
        } else if (i < 1000){
            gab +=  (i-(i/1000)*1000)/100 + (i-(i/100)*100)/10 + (i-(i/10)*10)/1;
        } else if (i < 10000){
            gab +=  (i-(i/10000)*10000)/1000 + (i-(i/1000)*1000)/100 + (i-(i/100)*100)/10 + (i-(i/10)*10)/1;
        }
        return gab+i;
    }
}

2017/01/06 18:58

Min Daehong

밑에 부분 generateNum 줄일수 있을텐데 제 머리의 한계라서 혹시 아시는분은 댓글 부탁드립니다. - Min Daehong, 2017/01/06 18:59

다른 분 코드 참고했어요


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);
    }

}

2017/01/09 19:29

김재인

            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}");

2017/01/16 16:52

오 예천

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 고수님께 부탁합니다ㅠㅠ 제 코딩에서 도데체 뭐가 잘 못 된거죠??

2017/01/17 06:23

Mingijin

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;
}

2017/01/20 14:05

이현섭

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

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

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

2017/01/20 23:01

Envil_Saintan

아 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;
    }
}

2017/01/25 17:37

박상민

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;
}

2017/01/30 14:29

박진규

#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;
}

2017/01/30 15:52

임지훈

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))

2017/01/30 18:06

Kumjip Park

def d(n):
    n=str(n)
    result=0
    for i in n:
        result+=int(i)
    return result+int(n)

dlist = [d(i) for i in range(1,5001)]

result=0
for i in range(1,5001):
    if i not in dlist:
        result+=i
print(result)

2017/02/12 01:22

wbpark

Python으로 작성해봤는데, 처음이라 허접합니다. 많이 보고 배워야 겠어요.

j = [0] * 5001
i = 1
while i < 5000:
    t = 0
    for a in (str(i)):
        t += int(a)
    s = t + i
    if s < 5000:
        j[s] = s
    i += 1

i = 1
t = 0
while i < 5000:
    if j[i] == int(0):
        t += i
    i += 1

print(str(t))

2017/02/16 11:42

김대선

**import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet**;

public class Generator {

    public static void main(String[] args) {
        int gen = 0;
        int gen2 = 0;
        int sum = 0;
        **ArrayList<Integer>** arr = new ArrayList<Integer>();
        HashSet<Integer> hs = new HashSet();

        arr.add(0);

        **for**(int i = 1; i < 5000; i++, gen = 0){
            gen += i;
            **for**(int j = i; j != 0; j /= 10){
                gen += (j % 10);
            }   
            arr.add(gen);
        }

        hs.addAll(arr);
        arr.clear();
        arr.addAll(hs);
        Collections.sort(arr);

        **for**(int i = 0; i <arr.size() - 1 && gen < 5000; i++){
            gen = arr.get(i + 1);
            gen2 = arr.get(i);
            **for**(; (gen-1) > gen2; gen--)
                **sum += gen;**
        }
        System.out.println(sum);

    }


}

2017/02/18 16:25

KimSeonbin

/*

dev : peanutBro

date : 170218

content : 

어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.

*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <iostream>
#include <string>
#include <stack>

using namespace std;

const int MAX_NUM = 5000;

int main(void)
{
    int resultNumber = 0;
    bool generatorCheck[MAX_NUM];

    for (int i = 0; i < MAX_NUM; i++)
    {
        generatorCheck[i] = false;
    }

    for (int i = 1; i <= MAX_NUM; i++)
    {
        int addNumber = i;
        char* buf = new char[4];
        _itoa(i, buf, 10);
        string numString(buf);
        for (int j = 0; j < numString.length(); j++)
        {
            addNumber += (numString[j] - '0');
        }
        if (addNumber >= 1 && addNumber <= MAX_NUM)
        {
            generatorCheck[addNumber - 1] = true;
        }
    }

    for (int i = 0; i < MAX_NUM; i++)
    {
        if (!(generatorCheck[i]))
        {
            resultNumber += i + 1;
            //cout << i + 1 << " ";
        }
    }
    cout << resultNumber << endl;

    return 0;
}

정답 : 1227365

2017/02/18 19:46

강병구 (peanutBro)

파이썬을 이제 막 배우기 시작해서 익히는 중입니다.

nums = list(range(1,5000))
for i in range(1, 5000):
    numstr = str(i)
    summ = i
    for j in range(len(numstr)):
        summ += int(numstr[j])
    if summ < 4999:
        nums[summ-1] = 0

selfnum = 0
for k in range(4999):
    selfnum += nums[k]

print("Answer: " + str(selfnum))

2017/02/19 18:18

아미타JOE

python 3.5.2

answer is .1227365

def main() :
    L = list(range(1,5000))
    for i in range(1,5000) :
        if L.count(g(i)) > 0 :
            L.remove(g(i))

    print(sum(L))


def g(n) :
    rt = 0
    for x in str(n) :
        rt += int(x)
    rt = rt + n
    return rt


if __name__ == '__main__' :
    L=[]
    main()


2017/02/21 05:27

강정민

result = []
result = set(range(1,5000)) - set(i + sum(int(stri) for stri in str(i)) for i in range(1,5000))
print(sum(result))

2017/02/21 13:25

진평수

당연하게 짜봤습니다 ㅎㅎ

#include <iostream>
using namespace std;

int d(int);

int main() {
    int sum = 0;
    int arr[5000] = { 0 };

    for (int i = 1; i < 5000; i++) {
        arr[i - 1] = d(i);
    }

    // search self-number
    for (int i = 1; i < 5000; i++) {

        // in array
        for (int j = 0; j < 5000; j++) {
            if (arr[j] == i) {
                break;
            }

            if (j == 4999) {
                sum += i;
            }
        }
    }

    cout << sum << endl;

    return 0;
}

int d(int generator) {
    int temp = generator;
    int result = 0;

    while (temp > 0) {
        result += (temp % 10);

        temp = (temp / 10);
    }

    return result + generator;
}

2017/02/22 21:56

Deokgyu Yang (Awesometic)

def createdn(n):
  tem = []
  for i in range(1,n+1):
    a = format(i,'04')
    sum = int(a[0]) + int(a[1])+ int(a[2])+int(a[3]) + int(a)
    tem.append(sum)
  return list(set(tem))

dn = [x for x in createdn(5000) if x<5000]
full = list(range(1,5000))
result = [x for x in full if x not in dn]

resultsum = 0
for i in result:
  resultsum += i

print(resultsum)

2017/02/24 17:43

김상엽

// Swift 3.0
var sum = 0;
func main() {
    var selfNumbers = [Int](repeatElement(0, count: 5000))
    for i in 0..<5000{
        let noneSelfNumer = generator(value: i + 1) - 1

        if noneSelfNumer < 5000{
            selfNumbers[noneSelfNumer] = 1
        }

        if selfNumbers[i] == 0{
            sum += i + 1
        }
    }
}

func generator(value: Int) -> Int{
    var stremNum = value;
    var sum = value;
    while stremNum != 0 {
        sum += stremNum % 10
        stremNum /= 10
    }
    return sum
}

main()
print(sum)

결과적으로 selfNumbers[i] 가 0이면 i+1 은 self-number 입니다.

2017/02/24 19:47

YoungHee Jang

static boolean[] generated= new boolean[5000];
    static int numTemp = 0;
    static int sum=0;
    static int result=0;

    public static void main(String[] args){
        for(int i=1; i<5000; i++){
            generate(i);
        }
        for(int i=1; i<5000; i++){
            if(!generated[i]){
                result +=i;
            }
        }
        System.out.println(result);

    }

    public static void generate(int num){
        numTemp = num;
        sum = 0;
        while(num>0){
            sum += num % 10;
            num/=10;
        }
        sum +=numTemp;
        generateCheck(sum);
    }

    public static void generateCheck(int sum) {
        if(sum >= 1 && sum < 5000){
            generated[sum] = true;
        }

    }

2017/02/27 14:21

Oh Tae Gyeoung

java - 1227365 - Oh Tae Gyeoung, 2017/02/27 14:22
def cal(gen):
    result = gen
    for i in str(gen):
        result += int(i)
    return result

gen_list = []
for i in range(1, 5000):
    gen_list.append(cal(i))
print(sum(set(range(1, 5000)) - set(gen_list)))

2017/03/02 16:38

odol


nums_list = range(1, 5000)
by_generator_list = []

for i in nums_list:
    nums = 0
    for ii in str(i):
        nums += int(ii)
    nums += i
    by_generator_list.append(nums)

for i in by_generator_list:
    if i in nums_list: nums_list.remove(i)

print sum(nums_list)

2017/03/02 21:24

정민 허

def d(number):
    total = number
    number = str(number)
    for i in number:
        total += int(i)
    return total

self_number_total = 0
self_number_set = set()

for i in range(1,5000):
    self_number_set.add(d(i))

for i in range(1,5000):
    if not i in self_number_set:
        self_number_total += i

print(self_number_total)

2017/03/03 14:09

수련

/****************************************************************************************
어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.
****************************************************************************************/

#include<stdio.h>

#define SIZE        5000
#define FALSE       0x00
#define TRUE        0x01

int Power(int base, int index);
int Generator(int input);
void Init_BYTE_arr(char* arr,int size);

int main(void)
{
    char data[SIZE];
    int i,sum_of_self_num=0,temp;

    Init_BYTE_arr(data,SIZE);

    for(i=1;i<=SIZE;i++)
    {
        temp=Generator(i);
        if(temp <= SIZE)
            data[temp]=TRUE;
    }

    for(i=1;i<=SIZE;i++)
    {
        if(data[i]==FALSE)
            sum_of_self_num+=i;
    }

    printf("%d",sum_of_self_num);

    return 0;
}

int Power(int base, int index)
{
    int result=1, i;
    for(i=0;i<index;i++)
    {
        result *= base;
    }
    return result;
}

int Generator(int input)
{
    int result=0,temp=0;
    int i;

    result+=input;

    for(i=3;i>=0;i--)
    {
        temp         = input/Power(10,i);
        input   -= temp*Power(10,i);
        result  += temp;
    }

    return result;
}

void Init_BYTE_arr(char* arr,int size)
{
    int i;

    for(i=0;i<size;i++)
        arr[i]=FALSE;
}

2017/03/04 19:41

이인규

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            List<int> intGeneratorList = new List<int>();
            int intSelfNumSum          = 0;

            for (int i = 1; i < 5000; i++)
            {
                if(intGeneratorList.Contains(i) == false)
                {
                    intSelfNumSum += i;
                }
                intGeneratorList.Add(GetGenerator(i));
            }

            Console.WriteLine("정답: " + intSelfNumSum);

        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            Console.ReadKey();
        }
    }

    static int GetGenerator(int intNum)
    {
        int intSum       = 0;
        char[] chArray   = null;

        chArray = intNum.ToString().ToCharArray();

        for (int i = 0; i < chArray.Length; i++)
        {
            intSum += Int32.Parse(chArray[i].ToString());
        }

        return intSum + intNum;
    }
}

2017/03/05 02:22

bobby

MATLAB 입니다. 답은 1227365 로 나오네요. 0.8 sec 정도 걸렸습니다.

clear all
close all
clc
tic

result=(1:5000); % potential candidates of self-numbers

for p=1:length(result) % p is a generator of a value candidate

    % itself + ...
    check_sum=p; 

    % + sum of each digit number
    string_p=num2str(p); 
    for q=1:length(string_p)
        check_sum=check_sum+str2num(string_p(q));
    end

    % excluding non self-numbers
    if check_sum <= max(result)
        result(check_sum)=0; 
    end
end

sum(result)

toc

2017/03/05 15:11

c0din9

public class GetMethod {
    int result =0;
    public int judgeGenerator(int num){
        for(int i = 0; i<num; i++){
            if ( num == i/1000+(i/100)%10+ (i/10)%10 + i%10+i){
                return 0;
            }
        }
        return num;
    }

    public static void main(String[] args){
        GetMethod obj = new GetMethod();
        for( int i = 1; i<5000; i++){
            obj.result += obj.judgeGenerator(i);
        }
        System.out.println(obj.result);
    }
}
많은분들이 올려주셨는데 저도 방금풀어본 코드로 올려봅니다.

2017/03/05 22:32

김종철

파이썬 3.5.3 연습용 코드입니다.

a = [x for x in range(1,5000)]


for x in range(1,5000):

    result = 0
    for y in str(x):
        result = result + int(y)

    result = result + x

    try:
        a.remove(result)

    except:
        pass

print(a)

2017/03/06 13:23

JH

#include <iostream>

static const int N = 5000;

int d(int);

void main() 
{
    int count = 0;              //for문의 실행횟수 카운터
    int temp = 0;               //d() 함수의 결과물 임시보관
    bool selfNumChecker[N + 1]; //셀프 넘버인지 아닌지 확인용
    int result = 0;             //최종결과물

    for(count = 0; count < N; count++) selfNumChecker[count] = true;

    for(count = 0, result = 0; count < N; count++)
    {
        result += count;
        temp = d(count);
        if((temp <= 5000) && (selfNumChecker[temp] == true))
        {
            result -= temp;
            selfNumChecker[temp] = false;
        }
    }

    std::cout << result << std::endl;

    return ;
}

int d(int n)
{
    int result = n;

    while(n != 0)
    {
        result += n % 10;
        n /= 10;
    }

    return result;
}

재밌네요

2017/03/09 01:45

백정인

def d(n): return n + sum([int(i) for i in str(n)])

answer = sum(n for n in range(5000))

chk = []

for i in range(5000):
    g = d(i)
    if(g<5000 and not g in chk):
        answer -= g
        chk.append(g)

print(answer)

올해 복학하고 처음 짜봅니다... 군대 갔다오니 머리에 기름칠이 필요한 것 갔습니다. ㅠㅠ

2017/03/10 09:46

유명성

   class Program
    {
        static void Main(string[] args)
        {
            int sum = 0;
            List<int> generatorList = new List<int>();
            for(int i=1; i<5000; i++)
            {
                int generatorResult = Generator(i);
                if (generatorResult < 5000)
                {
                    generatorList.Add(generatorResult);
                }
            }

            sum = Enumerable.Range(1, 5000).Where(x => !generatorList.Contains(x) && x <5000).Sum();
            Console.WriteLine(sum);
            Console.ReadLine();
        }

        private static int Generator(int inputNum)
        {
            string str = inputNum.ToString();
            int result = 0;

            for(int i=0; i<str.Length; i++)
            {
                result += Convert.ToInt32(str[i].ToString());
            }

            result += inputNum;

            return result;
        }
    }

2017/03/10 10:47

이명호

간단하게 풀어보았습니다 python 3.6.0


def ComputeNumber( n ) :
    res = n
    for i in str( n ):
        res += int( i )
    return res


tempList = [ComputeNumber(i) for i in range(1, 5000)]
result = sum( [ i for i in range(1, 5000) if i not in tempList] )

print( result )

2017/03/11 16:17

Ho Lee

C언어로 풀어 봤는데 1227365 맞나요?

#include<stdio.h>

int generator(int n){

int sum = 0;
int result = n;

while(result>0)
{    
    sum += result%10;
    result = result/10;
}
return sum + n;
}

int main(){

int sum = 0;
int i = 0, j = 0;
int genList[5000] = {0,};

for(i=0;i<5000;i++){
    genList[i] = generator(i+1);
    sum += (i+1);
}

for(i=0;i<5000;i++)
{
    for(j=0;j<5000;j++)
    {
        if(genList[j] == i+1){
            sum -= genList[j];
            break;
        }

    }
}
printf("%d", sum);

return 0;
}

2017/03/12 13:28

Jin Sung

어렵네요... Java 입니다



import java.util.Arrays;

public class Test {

      public static void Excute(){

            boolean[] noSelfList = new boolean[5000];           
            // 초기화          
            Arrays.fill(noSelfList, false);

            int g=1;// 제너레이터
            while(g<5001){
                // num(g) = deGenerator(no-self num)
                int num=getDeGenerator(g);
                if(num < 5000){
                    // num은 self num 이 아니다.
                    noSelfList[num] = true;
                }
                g++;
            }

            int count = 0;
            int result = 0;
            System.out.println("## Self Num List ##");

            for(int i=1;i<5000;i++){                
                if(noSelfList[i] == false){
                    System.out.println(i);
                    result=result+i;
                    count++;
                }               
            }                   
            System.out.println("## Self Num Count : "+count);
            System.out.println("## Self Num Sum : "+result);
        }

        public static void main(String[] args) {
             Excute();
        }

        // DeGenerater = d(generator)
        public static int getDeGenerator(int generator){
            // 자기자신을 더함
            int result=generator;

            // 자릿수
            int g_length  = String.valueOf(generator).length();

            // 각 자릿수 합
            for(int i=0;i<g_length;i++){              
                int p = generator%10;
                result+=p;              
                generator=generator/10;
            }

            // 자기자신을 제너레이터로 가진 넘버(no-self number)를 반환
            return result;
        }


}

2017/03/17 12:49

코코팜팜

C로 작성했습니다. 최대한 간단하게 만들려고 했는데 잘 안되네요. 초보라서 부족한 부분이 많으니 너그럽게 봐주시고 부족한 부분이 있으면 지적바랍니다.

#include <stdio.h>

#define DIVIDE(a, b, c, d, e) b = a/1000, c = a/100-10*b, d = a/10-100*b-10*c, e = a-b*1000-c*100-d*10
#define SUM(a, b, c, d, e) a + b + c + d + e

#define MAX 5000

int main(){

    int sum = 0;
    int num[MAX];
    int a, b, c, d;
    int temp;

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

        DIVIDE(i, a, b, c, d); // 자릿 수 분리

        temp = SUM(a, b, c, d, i); // 자릿 수 + 자신

        if(temp <= MAX){
            if(num[temp - 1] != temp)
                num[temp - 1] = temp;
        } // MAX 넘는 수 필터링
    } // 제네레이터 넘버 자기 위치에 저장

    for(int i = 0; i < MAX; i++){
        if(num[i] != i + 1)
            sum += (i + 1);
    } // 제네레이터 숫자 필터링 후 덧셈

    printf("%d", sum);

    return 0;
}

2017/03/27 01:01

dmz1023

public class Q1 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i=1, n=1, dn, result=0;
        int[] arr1 = new int[5000];
        int[] arr2 = new int[5000];

        for(n=1; n<5000; n++) {
            arr1[n] = n;
            dn = n + n/1000 + (n%1000)/100 + (n%100)/10 + (n%10)/1;
            arr2[n] = dn;
        }

        for(n=1; n<5000; n++) {
            for(i=1; i<5000; i++) {
                if(arr1[n] == arr2[i]) {
                    arr1[n] = 0;
                }
            }
        }

        for(n=1; n<5000; n++){
            result += arr1[n];
        }
        System.out.println(result);
    }
}

답: 1227365

.....답은 나오는데 코드가 너무 허졉하군요 뭔가 코딩한게 아니라 그냥 수학문제 푼 기분이예요.. 더 공부해서 더 나은 코드를 만들어 볼게요

2017/03/27 15:43

콩눈2

#include <iostream>                                                             

using namespace std;                                                            

int main(void)                                                                  
{                                                                               
    int i;                                                                      
    int sum = 0;                                                                
    int self_num;                                                               

    const int max_buf = (4999 + 4 + 9 + 9 + 9);                                 
    bool arr[max_buf] = {0, };                                                  

    for (i = 1; i <= 5000; i++)                                                 
    {                                                                           
        self_num =                                                              
            (i + (i / 1000 % 10) + (i / 100 % 10) + (i / 10 % 10) + (i % 10));  

        arr[self_num - 1] = true;                                               

        if (arr[i - 1] == 0)                                                    
            sum += i;                                                           
    }                                                                           

    cout << "sum : " << sum << endl;                                            

    return 0;                                                                   
}         

흠,, 이렇게 하면 되나요??

2017/03/29 09:41

by코딩요정

c언어로 풀었읍니다.

#include < stdio.h>

void main() {

    int i, j, temp, number, sum = 0;

    _Bool ar[5000] = { 0, };

    for (i = 1; i <= 5000; i++) {
        temp = i;
        number = 0;
        while (temp) {
            number += temp % 10;
            temp /= 10;
        }
        number += i;
        if (number <= 5000) {
            ar[number - 1] = 1;
        }
    }
    for (i = 0; i <= 5000; i++)
        if (ar[i] == 0)
            sum += i+1;

    printf("Self-Number Sum : %d\n", sum);
}

2017/03/31 12:52

dvv lee

def get_generated(number):
    return sum(map(int, str(number))) + number


# Generated number is greater than generator number.
# So use 1 ~ 5000 as generator to get all of
# generated number between 1 and 5000.
generated = set(
    get_generated(number)
    for number in range(1, 5000)
)

sum_of_self_numbers = sum(
    number
    for number in range(1, 5000)
    if number not in generated
)

print(sum_of_self_numbers)

2017/03/31 20:09

정아름

#include <iostream>
#include <set>
using namespace std;

void initSelfNumList(std::set<int> &selfNumLst)
{
    for (int num = 1; num < 5000; num++)
    {
        selfNumLst.insert(num);
    }
}

int calSelfNumSum(const std::set<int> &selfNumLst)
{
    int tot = 0;

    std::set<int>::iterator selfNumItor;
    for (selfNumItor = selfNumLst.begin(); selfNumItor != selfNumLst.end(); selfNumItor++)
    {
        tot += (*selfNumItor);
    }

    return tot;
}

void main()
{
    std::set<int> selfNumLst;
    std::set<int>::iterator selfNumItor;
    initSelfNumList(selfNumLst);

    for (int num = 1; num < 5000; num++)
    {
        char strNum[5] = { 0 };
        _itoa_s(num, strNum, 10);

        int sum = 0;
        for (int i = 0; i < 5; i++)
        {
            if (strNum[i] - '0' < 0)
                continue;
            sum += (strNum[i] - '0');
        }
        sum += num;

        selfNumItor = selfNumLst.find(sum);
        if (selfNumItor != selfNumLst.end())
        {
            selfNumLst.erase(selfNumItor);
        }
    }

    int tot = calSelfNumSum(selfNumLst);
}

2017/04/06 00:05

Ik Jun Choi

xx = []
for i in range(1,5001):
    if i >= 1000:
        a1 = i // (10**3)
        b1 = (i - a1 * (10**3)) // (10**2)
        c1 = (i - a1 * (10**3) - b1 * (10**2)) // 10
        d1 = (i - a1 * (10**3) - b1 * (10**2) - c1 * 10)
        x1 = (a1+b1+c1+d1+i)
        xx.append(x1)
    elif i >=100:
        a2 = 0
        b2 = i//(10**2)
        c2 = (i - b2 * (10**2)) // 10
        d2 = (i - b2 * (10**2) - c2 * 10 )
        x2 = (a2+b2+c2+d2+i)
        xx.append(x2)

    else:
        a3 = 0
        b3 = 0
        c3 = i//10
        d3 = (i-c3*10)
        x3= (a3 + b3 + c3 + d3 + i)
        xx.append(x3)

xxx = list(set(xx))
kk = []
for k in range(1,5001):
    if k not in xx:
        kk.append(k)
        ksum =sum(list(kk))

print(ksum)

2017/04/07 14:42

khahn0213

private static int sumOfSelfNum(int n){
        boolean generators[] = new boolean[n];

        for(int i=1; i<=n; i++){
            int sum = i;
            sum += i % 10;
            sum += (i / 10) % 10;
            sum += (i / 100) % 10;
            sum += (i / 1000);

            if(sum <= n){
                generators[sum-1] = true;
            }
        }

        int sumOfSelfNum = 0;
        for(int j=0; j<generators.length; j++){
            if(generators[j] == false){
                sumOfSelfNum += (j+1);
            }
        }

        return sumOfSelfNum;
    }

2017/04/07 17:55

yh

package training;

import java.util.ArrayList;

// d(91) = 9 + 1 + 91 = 101
public class NGenerator {

    public static void main(String[] args) {
        int iSum = 0;       
        ArrayList<Integer> arr = new ArrayList();

        for(int i=1;i<5000;i++){
            if(isSelfNum(i)){
                arr.add(i);
                iSum += i;
            }
        }
        System.out.println(arr);
        System.out.println("Sum of all Self number between 1 to 5000 : " + iSum);
    }

    public static boolean isSelfNum(int iNum){
        boolean isSelfNum = true;
        for(int i=1;i<iNum;i++){
            if(iNum == generator(i)){
                isSelfNum = false;
            }
        }
        return isSelfNum;
    }

    public static int generator(int iNum){
        String strNum = String.valueOf(iNum);
        int iSum = 0;
        for(int i=0;i<strNum.length();i++){
            iSum += Integer.parseInt(strNum.substring(i, i+1));
        }
        return iSum+iNum;
    }

}

2017/04/08 20:33

acedo

import java.util.Arrays;
class Practice02 {
    public static void main(String[] args) {

        int[] arr = Math_arr.selfNumArr(5000);

        System.out.println(Arrays.toString(arr));
    }
}

import java.util.Arrays;
class Practice02 {
    public static void main(String[] args) {

        int[] arr = Math_arr.selfNumArr(35);

        System.out.println(Arrays.toString(arr));
    }
}

class Math_arr {
    // 1 ~ v 사이의 self-number들로 구성된 배열을 반환하는 메서드
    static int[] selfNumArr(int v){
        int[] arr = new int[v];

        // 1. arr 배열에 1 ~ v 까지 저장
        for(int i = 0 ; i < v ; i++){
            arr[i] = i+1;
        }

        // 2. arr 배열에서 self-number가 아닌 값들은 전부 0으로 변환
        for(int i = 1 ; i <= v ; i++){
            int temp = i;
            int temp_sum = 0;
            while(temp > 0){
                temp_sum += temp%10;
                temp /= 10;
            }

            temp_sum += i;
            if(temp_sum-1 < v){
                arr[temp_sum-1] = 0;
            }
        }

        // 3. arr 배열에서 self-number의 개수를 구해서 cnt에 저장
        int cnt = 0;
        for(int o : arr){
            if( o != 0 ){ 
                cnt++; 
            }
        }

        // 4. 크기가 cnt만큼인 arr_ret배열을 생성
        int[] arr_ret = new int[cnt];

        // 5. cnt 만큼 반복문 ; arr 배열에서 0이 아닌값을 만날때마다 
        // arr_ret배열에 값을 추가
        int idx = 0;
        for(int i = 0 ; i < cnt ; i++){
            while(true){
                if(arr[idx] != 0){
                    arr_ret[i] = arr[idx];
                    idx++;
                    break;
                }else{
                    idx++;
                }
            }
        }

        return arr_ret;

    }
}

2017/04/19 14:50

SeonKi Lee


k = 0
T = []
G = set(range(1,5000)) 

for i in range(1,5000):
    for j in str(i):
        k+=int(j)
    T.append(k+i)
    k = 0

print sum(G-set(T))

2017/04/20 17:03

김나랑

range(1, 5000).filter(i -> range(1, i).filter(j -> (String.valueOf(j).chars().map(x -> x - '0').sum() + j == i)).sum() == 0).sum();

자바 8

2017/04/20 21:15

REKA

/*************************************************

java version "1.8.0_101" 64bits 

MacOS 10.12.4
Eclipse Neon.3 Release 4.6.3

어떤 자연수 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. 제네레이터가 없는 숫자가 셀프 넘버이기 때문에 전체 숫자에서 제네레이터를 지우는 형태로 찾아야한다.
   이를 위해서는 엘리먼트의 추가/삭제가 용이한 ArrayList를 이용한다.
2. Generator를 구하기 위한 함수를 별도로 만들어서 코드의 시인성을 높인다.

결과 : 1227365

고생했던 부분
1. ArrayList에서 엘리먼트를 삭제할 때 remove() 메쏘드를 사용했는데,
   remove()의 오퍼랜드로 integer를 입력하면 해당 숫자를 찾아 지우는 것이 아니라
   삭제할 엘리먼트의 인덱스 번호로 인식을 한다.
   즉 remove("A")라고 하면 "A"라는 엘리먼트를 삭제하지만
   remove(5)라고 하면 5번째 엘리먼트를 삭제한다.
   이때는 indexOf() 메쏘드를 사용하면 된다.
***************************************************/

import java.util.ArrayList; 
import java.lang.Math;

public class Java_generator {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int N = 5000;
        ArrayList<Integer> sn = new ArrayList<Integer>();

        for (int i = 1; i <= N; i++){
            sn.add(i);
        }

        int gen = 0;
        for (int i = 1; i <= N; i++){
            gen = generator(i);
            if(sn.contains(gen)){
                sn.remove(sn.indexOf(gen));
            }
        }

        int result = 0;
        for (int i = 0; i < sn.size(); i++){
            result = result + sn.get(i);
        }
        System.out.println(result);
    }

    public static int generator(int number){
        int result = number;
        int length = (int)Math.log10(number);
        for(int i = 0; i <= length; i++){
            result = result + (number % 10);
            number = (int)number/10;
        }
        return result;
    }

}

2017/04/22 20:32

J. J. Yang

파이썬 막 공부중입니다. 숫자 구간의 list를 미리 만들어 두고, generator를 제외한 후 남은 숫자를 더하는 방법으로 풀었습니다.

min_num, max_num = 1, 5000
chk_num, gen_num, sum_num = 0, 0, 0
self_num_list = []

def Generator(num):
    gen = num
    while num > 0 :
        mod = num % 10
        num = num // 10
        gen += mod
    return gen

print("%d ~ %d 사이의 self-number 합 구하기" % (min_num, max_num))

self_num_list = list(range(min_num, max_num+1))

for chk_num in range(min_num, max_num+1) :

    gen_num = Generator(chk_num)

    if gen_num <= max_num :
        try :
            self_num_list.remove(gen_num)
        except ValueError :
            pass

for i in range(0, len(self_num_list)) :
    sum_num += self_num_list[i]

print("합 : %d" % sum_num)

2017/04/24 17:29

켈리

        private void Generator(int num)
        {
            int sum = 0;
            int res = 0;
            num++;
            bool[] std = new bool[num];
            string str = "";

            for (int i = 1; i < num; i++)
            {
                res = makeGenerator(i);
                if(res < num)
                    std[res] = true;
            }

            for (int i = 1; i < num; i++)
            {
                if (!std[i])
                {
                    str += string.Format(" {0} ", i);
                    sum += i;
                }
            }

            MessageBox.Show(str + "총 합 = " + sum.ToString()); 
        }

        private int makeGenerator(int num)
        {
            int sum = num;
            string str = num.ToString();
            for (int i = 0; i < str.Length; i++)
                sum += Convert.ToInt32(str[i].ToString());

            return sum;
        }

2017/04/25 17:17

권영중

import java.util.ArrayList;
import java.util.HashSet;

public class test {

    public static void main(String[] args) {

        int one;
        int ten;
        int hundred;
        int thousand;
        ArrayList noSelfNumber = new ArrayList();

        for(int i=1 ; i<=5000 ; i++)
        {
            if(i>=1 && i<10)
            {
                one = i;
                noSelfNumber.add(one+i);
            }
            else if(i>=10 && i<100)
            {
                one = i%10;
                ten = i/10;
                noSelfNumber.add(one+ten+i);
            }
            else if(i>=100 && i<1000)
            {
                one = i%10;
                hundred = i/100;    
                ten = i/10 - hundred*10;
                noSelfNumber.add(one+ten+hundred+i);
            }
            else if(i>=1000 && i<=5000)
            {
                one = i%10;
                thousand = i/1000;
                hundred = i/100-thousand*10;
                ten = i/10-thousand*100-hundred*10;
                noSelfNumber.add(one+ten+hundred+thousand+i);
            }   
        }

        HashSet noDupl = new HashSet(noSelfNumber);
        ArrayList noSelfNumber2 = new ArrayList(noDupl);

        int sum = 0;
        int nosum = 0;
        for(int i=0; i<=5000; i++){
            sum+=i;
            if(i<noSelfNumber2.size() && (Integer)noSelfNumber2.get(i)<=5000)
                nosum+=(Integer)noSelfNumber2.get(i);
        }

        System.out.println(sum-nosum);

    }

}

2017/04/27 09:43

APeach KaKao

1227365! - APeach KaKao, 2017/04/27 13:27
  1. 차집합을 이용
selfnumset = set(range(1,5000))

for i in range(1,5000):
    non_selfnum = 0
    sum_hub = 0
    for j in str(i):
        sum_hub += int(j)
    non_selfnum = sum_hub + i
    selfnumset = selfnumset - set([non_selfnum])

result = 0
for i in list(selfnumset):
    result += i
print(result)

2017/05/02 12:58

고든

int[] Gen = new int[5050];
int sum = 0;

for (int i=1; i<10; i++){
  Gen[i + i] += 1;
}

for (int i=10; i<100; i++){
  Gen[i%10 + i/10 + i] += 1;
}

for (int i=100; i<1000; i++){
  int j = i%100;
  Gen[ i/100 + j/10 + j%10 + i ] += 1;
}

for (int i=1000; i<5000; i++){
  int j = i%1000;
  int k = j%100;
  Gen[ i/1000 + j/100 + k/10 + k%10 + i ] += 1;
}

for (int i=1; i<5000; i++){
  if (Gen[i]==0){sum+=i;}
}

println(sum);

답: 1227365

2017/05/03 16:35

Han Sanghoon

A=[]
for x in range (1,10000,1) :
    A= A + [ x ]
for x in range ( 1, 5000, 1 ) :
    if ( ( x / 1000) >= 1 ) :
        b = int( x / 1000 )+(int(x/100) %10) +(int(x/10)%10)  + (x%10) + x
        A[ b - 1 ] = 0
    elif ((x/100)>=1):
        b= int(x/100)+(int(x/10)%10)+ x%10 + x
        A[b-1]=0
    elif ((x/10)>=1):
        b=int(x/10)+ x%10 + x
        A[b-1]=0
    else:
        b= x + x
        A[b - 1] = 0
print(sum(A[:5001]))

2017/05/12 19:42

윤민섭(응용과학대학 응용수학과) ­

def selfnum(N):

List1 = [] 
for i in range(1,N+1):
    flag = False
    temp = 0
    for a in range(10):
        if flag == True:
            break
        for b in range(10):
            if flag == True:
                break
            for c in range(10):
                if flag == True:
                    break
                for d in range(10):

                    if a*1000 + b*100 + c*10 + d + a + b + c + d == i:
                        temp = i
                        flag = True
                        break



    if temp == 0:
        List1.append(i)

print("selfnum= %s" % List1)
print("sum of all selfnumbers = %s" %str(sum(List1)))

2017/05/14 14:53

김순효

import sys print (sys.version)

"""3.5.3 |Anaconda custom (x86_64)| (default, Mar 6 2017, 12:15:08) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]"""

num_list=[] for n in range(5000): str_n=str(n) sum_n=0 for i in range(len(str_n)): sum_n+=int(str_n[i]) sum_n+=n num_list.append(sum_n)

self_num=[] for i in range(5001): if i not in list(set(num_list)): self_num.append(i) else: next

sum(self_num)

answer : 1227365

2017/05/15 11:21

SC You

Swift

  • xcode
  • macOS command line project


// n + n%10 + (n/10^1)%10 + (n/10^2)%10 ... = d(n)
// d(n) > n
// d(5000) = 5005 > 5000 즉, d(n) 아무리 작아도 n + 1임
// 1 <= n < 5000인 각 n에 대해 d(n) 구하면 5000보다 작은 모든 d(n)을 구할 수 있음.
// 요렇게 구한 d(n) 값들을 검색 속도가 빠른 자료구조(여기서는 RB트리)에 담아뒀다가
// 1~4999 중에서 5000 보다 작은 d(n) 값을 제외한 나머지 값들의 합을 구함
//
// RBTree는 굳이 여기에 다 작성할 필욘 없을 것 같고, 대신 다른 자료구조에 담아 처리해도 됨

func d(gen: UInt, order: UInt) -> UInt {
    let q = gen/(UInt(pow(Double(10), Double(order))))
    if q == 0 { return 0 }

    return q%10 + d(gen: gen, order:order+1)
}


func solveP2() {

    let rbTree: RBTree = RBTree()

    for i in 1..<5000 {
        let n = UInt(i)
        rbTree.insert(n + d(gen: n, order:0))
    }

    var counter: Int = 0
    var sum: UInt = 0
    for i in 1..<5000 {
        let n = UInt(i)
        let node = rbTree.find(n)
        if node.value == nil {
            print(n, terminator:", ")
            counter += 1
            sum += n
        }
    }
    print("")
    print("Number of Self Numbers : \(counter)")
    print("Sum of Self Numbers : \(sum)")


}

2017/05/16 11:17

박정호

a=list(range(1,5001))
b=[]
sum=0
#자리수 구하는 함수
def ten(num):
    i=0
    while num//(10**i)!=0:
        i+=1
    return i-1
#제너레이트
def produce(n):
    i=ten(n)
    t=n
    a=0
    while i>=0:
        a+=t//(10**i)
        t-=(t//(10**i))*(10**i)
        i-=1
    a+=n
    return a
#제너레이트한 수를 b에 담는다.
for num in a:
    b.append(produce(num))
#집합을 사용해서 c에 셀프넘버를 담는다.
c=set(a)-set(b)
c=list(c)
#셀프넘버를 모두 더한다.
for num in c:
    sum+=num
print(sum)

2017/05/20 14:07

이태윤

def dn(x):
    dn=x
    while 1:
        if x>=1000:
            dn+=(int)(x/1000)
            x=x%1000
        if x>=100:
            dn+=(int)(x/100)
            x=x%100
        if x>=10:
            dn+=(int)(x/10)
            x=x%10
        if x<10:
            dn+=x
            break
    return dn
a=[]
index_number=sum(set(range(1,5000)))#number배열
for i in range(1,5000):
    if(dn(i)<5000):
        a.append(dn(i))
a=sum(set(a))
print(index_number-a)


2017/05/23 20:16

나후승

def getGenerator(n):
    sum = n
    for i in list(str(n)):
        sum += int(i)
    return sum

if __name__ == "__main__":
    gen_map = {}
    for i in range(1, 5000):
        gen_num = getGenerator(i)
        gen_map[gen_num] = i

    result = 0
    for i in range(1, 5000):
        if i not in gen_map:
            result += i
    print( result )

2017/05/24 11:02

장현수

python 3.6 일반공식을 구해보려고 했으나 일단 차집합으로 풀고 나서 생각해보렵니다.

num_set = {n for n in range(1,5001)}
no_self_set = {a+sum([int(i) for i in str(a)]) for a in range(1,5001)}
print(sum(num_set - no_self_set))

2017/05/28 11:25

예강효빠

#include <stdio.h>
//5000개 배열을 만들어 셀프넘버를 기록, 총 합을 구하는 방식입니다
int main(void) {
    int self[6000];
    int i,a,b,c,d,dn,n,sum=0;
    for(i=0;i<5000;i++){ //5000미만의 자연수 배열
        self[i]=1;
    }
    for(d=0;d<5;d++){   //1000의 자리 0~4
        for(c=0;c<10;c++){  //100의자리 0~9
            for(b=0;b<10;b++){ //10의 자리 0~9
                for(a=0;a<10;a++){  //1의자리 0~9
                    n=a+10*b+100*c+1000*d; //n은 dcba인 수
                    dn=a+b+c+d+n;       //d(n)은 d+c+b+a+n
                    self[dn]=0;         //셀프넘버가 아니면 배열이 0
                }
            }
        }
    }
    for(i=0;i<5000;i++){ //셀프넘버 합
        if(self[i]==1&&i<5000)
        sum=sum+i;
    }
    printf("%d",sum); //출력
    return 0;
}

전수조사밖에 떠오르는게 없네요 더 간결하게 적으신 분들 코드 보고 좀 배워야겠어요

2017/05/29 14:05

Gunhee Jo

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

    int num;
    int i,j;

    for(i = 1; i < 5000; i++)
    {
        for(j = 1; j <= i;j++)
        {
            if( count(j) == i )
            {
                j = 0;
                break;
            }
        }
        if(j != 0)
            printf("%d ", i);
    }

    return 0;
}




int count(int num)
//Find Generator
{
    int arr[4] = {0,0,0,0};
    int sum, i;

    sum = num;

    for(i = 3 ; i >= 0 ; i--)
    {

        arr[i] = num % 10;
        num /= 10;

        if(num < 0)
        {
            break;
        }
    }

    for(i = 0 ; i < 4 ; i++)
    {
        sum+=arr[i];
    }

    return sum;
}

2017/05/29 15:38

Jero

w = 1
v = 0
m = []
l = []

def s(x, n):
    a = x%(10**(n+1)) - x%(10**n)
    return a

def d(n):
    v = n + s(n, 3) + s(n, 2) + s(n, 1) + s(n, 0)
    return v

while w <= 5000:
     m.append(d(w))

while w <= 5000:
    l.append(w)

for k in m:
   for u in l:
        if k == u:
            l.remove(u)

x = sum(l)

print(x)



흠... 항상 다 풀고 컴퓨터 돌리면 실행이 한참 걸리네요. 인터프리터 언어라서 그런가요?

2017/05/30 00:28

TohnoSiki

#include <iostream>
using namespace std;

int d(int n) { return n + n / 1000 + (n % 1000) / 100 + ((n % 1000) % 100) / 10 + ((n % 1000) % 100) % 10; }

int main(void) {

    int len = 20;
    int * n = new int[len];

    for (int i = 1; i <= len; i++)
        n[d(i)] = true;

    int sum = 0;
    for (int i = 1; i <= len; i++) {
        if (n[i] != 1)
            sum += i;
    }

    cout << sum << endl;
}

2017/05/30 11:00

Song

c로 풀이


#include <stdio.h>
int generator(int n);
int same_gen(int n);
int main(void)
{
    int i,sum=0;
    for(i=1;i<=5000;i++) sum=sum+i-(same_gen(i)*generator(i));
    printf("%d",sum);
    return 0;
}
int generator(int n)
{
    int m;
    m=(n+(n/1000)+((n%1000)/100)+((n%100)/10)+(n%10));
    if (m<=5000) return m;
    else return 0;
}
int same_gen(int n)
{
    int i,num=0;
    for(i=n+1;i<=5000;i++) if(generator(i)==generator(n)) num++;
    if (num==0) return 1;
    else return 0;
}

2017/05/31 10:04

박동준

// 넥슨 입사 문제: 셀프 넘버 - C#

using System;
using System.Collections.Generic;

namespace selfnumber
{
    class nana
    {
        static void Main(string[] args)
        {
            List<int> generator = new List<int>();
            List<int> self = new List<int>();

            for (int i = 1; i < 5000; i++)
            {
                if (i < 10)
                    generator.Add(i + i);
                else if (i < 100)
                    generator.Add(i / 10 + i % 10 + i);
                else if (i < 1000)
                    generator.Add(i / 100 + i / 10 % 10 + i % 10 + i);
                else
                    generator.Add(i / 1000 + i / 100 % 10 + i / 10 % 10 + i % 10 + i);
            }
            generator.Sort();
            for (int i = 0; i < 5000; i++)
                if (!(generator.Contains(i)))
                    self.Add(i);

            int sum = 0;
            foreach (int i in self)
                sum += i;
            Console.WriteLine(sum);
            // 답은 1227365
        }
    }
}

2017/05/31 10:10

Jeong Hoon Lee

파이썬(은 사랑) 입니다

def self_number(): 
    li = []
    for i in range(1,5001):
        li.append(i + sum([int(j) for j in str(i)]))

    return sum(set(range(1,5001)) - set(li))

2017/06/09 19:34

HYUNJOO LEE (wayhome)

sum(set(range(1, 5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)})

2017/06/12 21:54

문정민 (◕◡◕)

javascript(ES6)

var selfnumbers = Array.from(Array(5000), (_, i) => i + 1);
var add = (a, b) => a + b;
var str2int = s => parseInt(s, 10)
var gen = n => n + ("" + n).split('').map(str2int).reduce(add);

for (let i = 1; i <= 5000; i++) {
    selfnumbers[gen(i) - 1] = 0;
}

var sum = selfnumbers.reduce(add);

console.log(sum);

for 문 없이 아래와 같이 할 수도 있는데, 그러면 selfnumbers 가 chain 되지 않아서 .reduce 를 chain 할 수가 없음

selfnumbers.map((v, i, a) => { a[gen(i + 1) - 1] = 0 })
var sum = selfnumbers.reduce(add);

파이썬 코드에 감명받아서, 차집합으로 다시 풀어봤습니다.

var numbers = Array.from(Array(5000), (value, index) => index + 1);
var add = (a, b) => (+a) + (+b);
var genned = new Set(numbers.map(n => n + `${n}`.split('').reduce(add, 0)));
var selfsum = numbers.filter(x => !genned.has(x)).reduce(add, 0);

console.log(selfsum);

2017/06/14 11:56

funnystyle

lir = []
ans = 0

for i in range(1,5001):
    lir.append(i)

for i in range(1,5001):
    print(i)
    for j in range(1,5001):
        a = j//1000
        b = (j-a*1000)//100
        c = (j-a*1000-b*100)//10
        d = (j-a*1000-b*100-c*10)
        if a+b+c+d+j == i:
            if lir.count(i) != 0:
                lir.remove(i)

for i in lir:
    ans += i

print(ans)

포문으로 간단하게 해봤습니다..

2017/06/16 02:25

김코딩

#include<stdio.h>

int main(void)
{
    int sum_seq = 0;
    int judge = 0;
    int sum = 0;
    int a, b, c, d;
    int i;

    for (i = 0;i < 5000;i++) {
        sum_seq += i;
    }

    for (i = 0;i < 5000;i++) {
        judge = 0;
        for (a = 0; a < 5; a++) {
            for (b = 0; b < 10; b++) {
                for (c = 0;c < 10; c++) {
                    for (d = 0; d < 10; d++) {
                        if (i == 1001 * a + 101 * b + 11 * c + 2 * d) {
                            sum += i;
                            judge += 1;
                            break;
                        }
                    }
                    if(judge!=0)
                    break;
                }
                if (judge != 0)
                break;
            }
            if (judge != 0)
            break;
        }
    }

    printf("sum = %d", sum_seq - sum);

    return 0;
}

2017/06/18 14:44

조밍

array={0}
for i in range(5001):
    array.add(i)


for a in range(10):
    for b in range(10):
        for c in range(10):
            for d in range(10):
                array = array - {1001*a+101*b+11*c+2*d}

_sum = 0
listarray = list(array)

for j in range(len(listarray)):
    _sum = _sum + listarray[j]

2017/06/21 09:53

hgj

/*
프로그램 내용 : 어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.

작성한 날짜   : 2017년 6월 20일
*/
#include <stdio.h>

#define len 5000

int d(int num)
{
    int sum = num;  //처음 숫자를 저장

    while (num > 0)
    {
        sum += num % 10;    
        num /= 10;  //num이 0이될때 까지 저장한다
    }

    return sum;
}

int main()
{
    int gen[len] = { 0 };
    int sum = 0;

    for (int i = 1; i < len; i++)
    {
        if (d(i) < len) //5000보다 작으면 실행
        {
            gen[d(i)] = 1;  //1로 체크
        }
    }

    for (int i = 1; i < len; i++)
    {
        if (gen[i] == 0)
        {
            sum += i;   //제네레이터가 없는 셀프넘버 합 계산
        }
    }

    printf("%d\n", sum);

    return 0;
}

2017/06/22 04:29

aassder

go로 풀어봤습니다.

// ysoftman
package main

import (
    "fmt"
)

const mxvalue int = 5000

func main() {
    var result map[int]int
    result = make(map[int]int)
    for i := 1; i < mxvalue; i++ {
        result[i] = 0
    }
    for i := 1; i < mxvalue; i++ {
        temp := i
        sum := 0
        for temp > 0 {
            sum += temp % 10
            temp = temp / 10
        }
        sum += i
        // fmt.Println(i, "->", sum)
        result[sum] = 1
    }
    sum := 0
    for i := 1; i < mxvalue; i++ {
        if result[i] == 0 {
            // fmt.Println(i)
            sum += i
        }
    }
    fmt.Println(sum)
}

2017/06/26 14:22

ByoungHoon Yoon

파이썬으로 풀어보았습니다. 초보라 많이 미숙합니다.

def check():
    genGroup = set()
    for a in range(1,5000):
        numGroup = []
        numsGroup = []
        total = 0
        for n in range(4):
            numGroup.append(a // 10**n)
        numsGroup = list(map(lambda num: num % 10, numGroup))
        for i in numsGroup:
            total += i
        b = total + a
        genGroup.add(b)
    return genGroup

allGroup = set(range(1,5000))
selfGroup = allGroup - check()
total = 0
for n in selfGroup:
    total += n
print(total)

2017/06/27 14:29

박지상

g = []
not_g = []

def d(x):
    num_str = list(str(x))

    plus = x

    for member in num_str:
        plus = plus + int(member)

    return(plus)


for member in range(5000):
    g.append(d(member))

for member in range(5000):
    if member not in g:
        not_g.append(member)

print(sum(not_g))

2017/06/28 19:54

안성준

[Python 3.6]

def d(generator):
    result = generator
    for num in str(generator):
        result += int(num)
    return result

nonselfnum = set()
for num in range(5000):
    nonselfnum.add(d(num))
selfnum = set(range(5000))-nonselfnum

print(sum(selfnum))

2017/07/01 13:18

Eliya

이중 배열을 사용하여 풀었습니다.

public class generate
{
  public static void main(String[] args)
  {
    //이중 배열
    int[][] numbers = new int[5000][2];
    int result = 0;

    for(int i = 0; i < 5000; i++)
    {
      numbers[i][0] = i;//1~4999까지의 값
      numbers[i][1] = 0;//셀프함수 여부
    }

    for(int i = 0; i < 5000; i++)
    {
      int temp = numbers[i][0];
      int calTemp = temp;

      while(temp > 0)//각 자리수로 parsing
      {
        calTemp += temp % 10;
        temp = temp / 10;
      }

      if(calTemp < 5000)//계산된 값이 범위 내에 있을 경우
      {
        numbers[calTemp][1] = -1;//해당 값의 셀프숫자 여부를 -1로 수정함
      }

      if(numbers[i][1] != -1)//현재 계산한 숫자가 셀프 숫자인 경우 result에 합산.
      {
        result += numbers[i][0];
      }
    }


    System.out.println(result);

  }
}

2017/07/01 14:17

신종혁

public static void main(String[] args) {

        int sum = findSelfNumber();
        System.out.println("The sum of self numbers: " + sum);
    }

    public static int findSelfNumber() {
        boolean[] numbers = new boolean[5001];

        for (int i=1; i<=5000; i++) {
            int gen = getGenerator(i);
            if (gen >= 1 && gen <= 5000) {
                numbers[gen] = true;
            }
        }

        int sum = 0;
        for (int i=1; i<=5000; i++) {
            if(!numbers[i]) {
                sum += i;
            }
        }
        return sum;
    }

    public static int getGenerator(int n) {
        int generator = n;
        String num = Integer.toString(n);
        for (int i=0; i<num.length(); i++) {
            generator += Integer.valueOf(String.valueOf(num.charAt(i)));
        }

        return generator;
    }

2017/07/02 09:02

KS

#include <iostream>
#include <cstdio>

using namespace std;

int getValuebyGenerator(int);

int main()
{
    int num[5000];
    int haveGenerator[5000] = {0,};
    int i = 0;
    int result = 0;

    for (i = 1; i <=5000; i++)
        num[i-1] = getValuebyGenerator(i);

    for (i = 0; i < 5000; i++) {
        if (num[i] <= 5000)
            haveGenerator[(num[i] - 1)] = 1;
    }

    for (i = 0; i < 5000; i++) {
        if (haveGenerator[i] == 0) {
            result += (i + 1);
            cout << i+1 << "  ";
        }
    }

    cout << endl << endl << "result : " << result << endl;
    return 0;   
}

int getValuebyGenerator(int x)
{
    return (x + x/1000 + (x%1000)/100 + (x%100)/10 + x%10);
}

2017/07/03 09:56

Logan

public class Ex2 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("셀프넘버 합: " + sumOfSelfnum());

    }   


    private static int sumOfSelfnum() {
        ArrayList<Integer> notSelfnums = calcNotSelfnum();
        int sumOfSelfnum = 0;

        for(int i=1; i< 5000; i++) {
            if(!notSelfnums.contains(i))
                sumOfSelfnum += i;
        }

        return sumOfSelfnum;
    }

    private static ArrayList<Integer> calcNotSelfnum() {
        ArrayList<Integer> arr = new ArrayList<>();

        for(int i=1; i< 5000; i++) {
            //제네레이터를 갖는 수를 구한다.
            int temp = i;
            int generator = temp;
            do {
                generator += temp%10;
                temp /= 10;
            }while(temp != 0);


            if(generator < 5000) {
                arr.add(generator);
                System.out.println("삽입: " + generator);
            }
        }

        return arr;
    }   
}

2017/07/03 17:09

pg

Python으로 풀었습니다. (1227365)

def solve(max):
    total = 0
    non_self = set()
    for x in range(1, max + 1):
        if x not in non_self:
            total += x
        non_self.add(x + eval('+'.join(str(x))))
    return total

print(solve(5000))

2017/07/04 20:41

SOUP

all = set(range(1,5000))
gen = {eval('+'.join(str(n))) + n for n in all}
selfnum = all - gen
print(sum(selfnum))

2017/07/06 01:15

Noname

    static int d(int n){
        int result=0, limit=0;
        result += n;

        for(int i=1; i<=n; i*=10) limit = i;
        for(int i=limit; i>=1; i/= 10) {
            result += n/i;
            n -= (n/i)*i;
        }
        return result;
    }

    public static void main(String[] args){
        int num[] = new int[5000];
        int i=0, sum=0;

        for(int j=0; j<num.length; j++) num[j] = j+1;
        for(int j=0; j<num.length; j++) {
            if(d(j+1) <= 5000) num[d(j+1)-1] = 0;
        }
        for(int j=0; j<num.length; j++){
            if(num[j] != 0) {
                sum+= num[j];
                System.out.println(num[j]);
            }
        }
        System.out.println("1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합은 " + sum + "이다.");
    }
}

2017/07/10 18:02

낑깡

def mygen(num):
    sum = 0
    for i in str(num):
        sum += int(i)
    return (sum + num)

oneto5000 = set(list(range(1,5000)))
notselfnum = set()
for i in range(1,5000):
    notselfnum.update([mygen(i)])

print(sum(oneto5000-notselfnum))

2017/07/14 21:00

ynwag94

package java_tutorial;

public class Selfnumber {

    public static void main(String[] args) {

        boolean [] generator = new boolean[5000];
        int generNum = 0;
        int sum = 0;

        for(int i= 1; i < 5000; i++)
        {
                generNum = (i/1000) + (i/100)%10 + (i/10)%100 + i%1000 + i;
                if(generNum>0 && generNum<5000)
                {
                        generator[generNum] = true;
                }
        }

        for(int i = 1; i < 5000; i++) 
        {
                if(generator[i]==false)
                {
                        sum += i;
                }
        }

        System.out.println("The answer is " + sum);
    }

}

2017/07/15 14:53

최원석

파이썬  초보자 입니다... 

total = []
for k in range(1, 5001):
    total.append(k)



for i in range(1,5001):
    sum = 0
    for j in str(i):
        sum += int(j)
    sum += i

    if sum in total:
        total.remove(sum)
    else :
        continue

sumValue = 0
for num in total:
    sumValue += num

print(sumValue)

2017/07/18 23:26

semipooh

#include<stdio.h>

int d(int n);

int main(void)
{
    int arr[5000];
    int n = 5000;
    int i, j; 
    int total = 0;
    for (i = 0; i < 5000; i++)
        arr[i] = i + 1;
    for (i = 0; i < 5000; i++)
        for (j = 0; j < 5000; j++)
            if (arr[i] == d(j))
                arr[i] = 0;
    for (i = 0; i < 5000; i++)
        total += arr[i];
    printf("%d", total);
    return 0;
}

int d(int n)
{
    int temp = n;
    int gen = 0;
    while (temp * 10 / 10 != 0)
    {
        gen += temp % 10;
        temp = temp / 10;
    }
    gen = gen + n;
    return gen;
}

2017/07/21 11:26

MAKESOME

# Generator function
def d(number) :
    result = 0
    for i in range(0, len(str(number))) :
        result += int(str(number)[i])
    return result + number

# Non-selfnumbers
non_selfnumbers = []
n = 1
while True :
    non_selfnumbers.append(d(n))
    n += 1
    if n >= 5000 :
        break

# Numbers in range 1 ~ 5000
total_numbers = []
for i in range(1, 5001) :
    total_numbers.append(i)

# Lists to sets
s1 = set(non_selfnumbers)
s2 = set(total_numbers)

# The result
print(sum(s2) - sum(s1 & s2))

2017/07/26 22:34

다크엔젤

li = list(range(1,5000))
for i in range(1,5000):
    a = i//1000+(i%1000//100)+(i%100//10)+(i%10)+i
    if a in li:
        li.remove(a)
    else:
        continue
sum(li)

2017/07/30 18:12

이다경

import java.util.HashSet;
import java.util.Set;

public class Lv2 {

    public int func(int num){
        Set<Integer> set = new HashSet<Integer>();
        int result = 0;
        for(int i = 1; i< num; i++)
            set.add(new Integer(i));
        for(int i = 1; i<=num;i++){
            int gen = 0;
            char[] chars = String.valueOf(i).toCharArray();
            for(int j = 0; j< chars.length;j++)
                gen += chars[j] - 48;
            gen += i;
            set.remove(gen);
        }
        for (Integer integer : set) {
            result += integer;
        }
        return result;
    }
    public static void main(String[] args){

        Lv2 obj = new Lv2();
        System.out.println(obj.func(5000));
    }
}

2017/08/01 16:55

sunga

1부터 5000까지의 숫자의 제네레이터를 모두 구해 리스트에 넣고, 1부터 5000까지 수들 중에 제네레이터에 해당되는 수를 제외한 다음 나머지를 더하면 됩니다.(코드는 참조하지 않음)

2017/08/01 17:13

P.Y.Thon

def digit_sum(n):
    sum = 0
    while n:
        sum,n = sum+ n%10, n//10
    return sum

total = []
for i in range(1,5000):
    total.append(i+digit_sum(i))

selfnumber = (set(list(range(1,5001)))-set(total))

print(sum(selfnumber))

2017/08/02 15:31

이현우

def d(n):

    result = 0

    for num in str(n):
        result += int(num)
    result += n

    return result

nums = set(range(1, 5000+1))
d_nums = set()

for num in nums:
    d_nums.add(d(num))

s_nums = nums - d_nums

print(sum(s_nums))
실행결과: 1227365

python3로 작성했고, 차집합연산을 이용하기 위해서 집합(set) 자료형을 사용하였습니다.

2017/08/03 14:43

Envil_Saintan

#include <iostream>
#include <cstdlib>

using namespace std;

#define MAX 5000

int get_val(int num)
{
    return (num / 1000 + (num % 1000) / 100 + (num % 100) / 10 + num % 10 + num);
}


void main() {

    bool check[MAX] = { 0, };

    int ch_target = 0;

    int ch_sum = 0;

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

        ch_sum = get_val(i);
        check[ch_sum] = 1;
        ch_sum = 0;
    }


    for (int j = 0; j < MAX; j++) {
        if (check[j] == 0) {
            //cout << "self-num =  ";
            ch_sum += j;
        }
    }

    cout << endl << "결과 = " << ch_sum << endl; 

    system("pause");

}

2017/08/03 21:04

Yun-Jae Lee

R로 작성하였습니다.

{.r}
gene <- function(x) {
  result <- sum(as.numeric(unlist(strsplit(as.character(x),""))))+x
  return(result)
}

a <- 1:5000
b <- sapply(a, gene)
self <- setdiff(a,b)
sum(self)

2017/08/04 11:17

임승남

def d(n): result=n while n!=0: result+=n%10 n//=10 return result

A=[d(n) for n in range(5000)] B=[n for n in range(5000) if n not in A] print(sum(B))

Python 3

2017/08/05 19:14

김수현

파이썬으로 작성되었습니다.

list1 = list(range(1, 5000))

for i in range(5000):
    remove_num = (i % 10000) // 1000 + (i % 1000) // 100 + (i % 100) // 10 + (i % 10) // 1 + i
    if remove_num in list1:
        list1.remove(remove_num)


sum = 0
for i in list1:
    sum += i

print(sum)

result = 1227365

: 셀프 넘버를 구하는 방법은 구현이 잘 안되어서 셀프 넘버가 아닌 값을 제거하는 방식으로 구현해봤습니다. 1부터 5000까지의 리스트를 생성후 for문을 통해 돌면서 제너레이터를 가진 값들을 모두 소거하는 방식입니다.

2017/08/05 19:48

핏스

def d(num):
    num=str(num)
    s=int(num)
    for i in num:
        s+=int(i)
    return(s)
total= 0
self_num = []
for i in range(1,5000):
    self_num.append(d(i))
for i in range(1,5000):
    if i not in self_num:
        total += i

print(total)

2017/08/07 15:03

Sunghwan Yoo

def d(n): return n+sum([int(i) for i in str(n)])

origin = set(range(1,5000))
setfunc = set([d(n) for n in range(1,5000)])

print (sum(origin - setfunc))

2017/08/09 14:56

Sangwoon Park

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int charToInt(char c);
int main()
{
    char *p = (char*)malloc(sizeof(char)*4);
    int arr[5000];
    int cnt = 0;
    for(int i=0;i<5000;i++)
        arr[i] = 0;
    int result = 0;
    for(int i=1;i<=5000;i++)
    {
        sprintf(p,"%d",i);
        int len = strlen(p);
        for(int j=0;j<len;j++)
        {
            result = result + charToInt(p[j]);
        }

        arr[cnt] = atoi(p) + result;
        result=0;
        cnt++;  
    }
    for(int i=0;i<5000;i++)
        printf("%d ",arr[i]);
    int flag = 0;
    for(int i=0;i<5000;i++)
    {
        for(int j=0;j<5000;j++)
        {
            if(i==arr[j])
                flag = 1;       
        }
        if(flag == 1)
            printf("%d ",i);
    }
    return 0;
}
int charToInt(char c)
{
    printf("%d\n",(int)c - 48);
    return (int)c - 48;
}

2017/08/10 13:57

임꺽정

a=sum(set(range(1,5000))-{x+sum([int(i) for i in str(x)]) for x in range(1,5000)})
print(a)

2017/08/14 16:14

Kardia18

def noneSelfNumber(num):
    k=0
    k+=num
    while num>0:
        k=k+num%10
        num=num//10
    return k

D=set([noneSelfNumber(n) for n in range(32)])

Z=set([n for n in range(32) if n not in D])

print(sum(Z))

2017/08/19 20:22

Catnap

깔끔하게 작성하기 쉽지 않네요.

def GetNotSelfNo(n) :
    sub = 0
    for i in str(n) :
        sub = sub + int(i)
    return sub + n

origin = set(range(1, 5001))

none_self_no = set()
for i in range(1, 5000) : 
    none_self_no.add(GetNotSelfNo(i))
print(none_self_no)

self_no = origin - none_self_no
print(self_no)

final_sum = 0;
for n in self_no :
    final_sum += n

print(final_sum)

2017/08/21 13:36

김동환

def d(num):
    tot = 0
    num_str = str(num)
    for char in num_str:
        tot += int(char)
    tot += num
    return tot

arr1 = []
for cnt in range(1, 5000):
    arr1.append(d(cnt))

arr1 = set(arr1)
arr2 = set(range(1, 5000))

print(sum(arr2 - arr1))

2017/08/21 16:32

piko

def generator(n):
    n =str(n)
    sum =int(n)
    for i in n:
        sum += int(i)
    return sum
total = 0
selfList = [generator(i) for i in range(5000)]
for i in range(5000):
    if i not in selfList:
        total += i
print(total)

2017/08/22 16:23

윤건석 (can9165)

2017/08/23 15:41

김주영

문제풀면서 다른분 정보 좋은거 많이 배워가네요 저는 가장 단순판 방법으로 했어요.

def d(n):
    tot = n
    for i in str(n):
        tot += int(i)
    return tot

generator = []
cnt = 1

for i in range(1,5001):
    generator.append(i)

while 1:
    res = d(cnt)
    if res > 5000:
        break
    if res in generator:
        generator.remove(d(cnt))
    cnt += 1

print(sum(generator))

2017/08/24 17:56

꿀버터칩

public class Example1 {
    public static void main(String[] args) {
        Example1 ex = new Example1();
        LinkedHashSet<Integer> setInteger = new LinkedHashSet<Integer>();   

        for (int i = 0; i < 5000; i++) {
            setInteger.add(ex.getGeneratorNum(i));
        }

        int sum = 0;
        for (int i = 0; i < 5000; i++) {
            if (!setInteger.contains(i))
                sum += i;
        }

        System.out.println(sum);

    }

    private int getGeneratorNum(int n) {
        int num = 0;

        String str = String.valueOf(n);
        for (int i = 0; i < str.length(); i++) {
            num += Integer.parseInt(str.substring(i, i + 1));
        }
        return num + n;
    }
}

LinkedHashSet을 사용한 이유는 순차적으로 집어 넣을려고 사용했습니다.

2017/08/28 13:48

흑돼지

// golang 1.9
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // mapping the generated
    dned := make(map[int]int)
    for i := 1; i <= 5000; i++ {
        dned[d(i)] += 1
    }
    // sum self numbers
    var sum int = 0
    for i := 1; i < 5000; i++ {
        if _, exist := dned[i]; !exist {
            sum += i
        }
    }
    fmt.Println(sum)
}

// calculate generated number, d(n)
func d(n int) int {
    nstr := strconv.Itoa(n)
    var calc int = n
    for i := 0; i < len(nstr); i++ {
        cnvVal, _ := strconv.Atoi(nstr[i : i+1])
        calc += cnvVal
    }
    return calc
}

// ans: 1227365

2017/08/28 17:39

mohenjo

#01

def gen(n):
    r = n
    for i in str(n):
        r += int(i)
    return r

list = []
self = []

for i in range(1, 5000):
    r = gen(i)
    list.append(r)

for i in range(1, 5000):
    if not i in list:
        self.append(i)
    a = sum(self)
print(a)

오늘 처음 문제 풀어 봤습니다!!

2017/08/28 20:12

검은콩

public class Ex {
    public static void main(String[] args) {
        int sum = 0;


        String[] str = new String[5000];
        for(int i=0;i<str.length;i++) {
            str[i] = String.valueOf(i);
        }
        boolean[] flag = new boolean[5000];

        for(int i=1;i<str.length;i++) {
            int length = str[i].length();
            int value = 0;
            for(int k=0;k<length;k++) {
                int x = Integer.parseInt(str[i].substring(k, k+1));
                value += x;
            }
            value += i;
            if(value < 5000)
                flag[value] = true;
        }

        for(int i=1;i<5000;i++) {
            if(flag[i] == false) {
                sum += i;
            }
        }

        System.out.println(sum);
    }
}

2017/08/29 17:11

염현우

자바로 풀었습니다. 1 ~ 5000의 각 값을 연산하여 제네레이터를 가질 수 있는 값을 찾은 후 제네레이터를 가지지 못한 값을 추출하는 방식으로 풀었네요. 좀 더 개선해 볼 부분들이 있을 듯...

public class SumOfSelfNumber {

    private static final int MAX_NUM = 5000;

    public static void main(String[] args) {
        List<Integer> hasGenerators = new ArrayList<>();
        int sumSelfNum = 0;

        for(int i = 1; i < MAX_NUM; i++) {
            String num = String.valueOf(i);
            int sumOfNumElement = 0;

            for(int j = 0; j < num.length(); j++) {
                sumOfNumElement += Integer.valueOf(num.substring(j, j + 1));
            }

            hasGenerators.add(sumOfNumElement + i);
        }

        for(int i = 0; i < MAX_NUM; i++) {
            if(!hasGenerators.contains(i)) {
                sumSelfNum += i;
            }
        }

        System.out.println("sum of self number is " + sumSelfNum);
    }
}

2017/08/30 10:20

Lee SeungChul

자바로 했습니다~ 첫 문제풀이 ㅎㅎ 지적 감사하게 받겠습니다. 모두들 좋은 하루 되시길^0^


public class Number1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n;
        int dn;
        int sum = 0;
        int[] generatorNum = new int [5000]; 
        boolean flag = false;

        for(int i=0;i<5000;i++) {  //제네레이터 수를 배열에 저장한다.
            n = i+1; 
            dn = (n/1000) + (n/100)%10 + (n/10)%10 + (n%10) + n;
            generatorNum[i] = dn;
        }

        for(int j=1; j<5000; j++) { //제네레이터 수를 제외한 수를 sum에 더한다.
            flag = false;
            for(int k=0;k<5000;k++) {
                if(generatorNum[k] == j) {
                    flag = true;
                }
            }
            if(flag == false) {
                sum += j;
            }
        }
        System.out.print(sum);
    }
}


실행결과 : 1227365

2017/08/30 20:25

롸잇나우

# -*- coding:utf-8 -*-
# python 3.6

maxAmount = 5000  # 최대값
# generating
gen = [n + sum([int(i) for i in str(n)]) for n in range(1, maxAmount)]
# 차집합으로 self-number 계산
selfNum = set([i for i in range(1, maxAmount)]) - set(gen)

print(sum(selfNum))
# ans: 1227365

2017/09/01 10:40

mohenjo

x=list(range(1,5001))
index=[1]*5000
for i in range(1,5001):
    d=i%10+int((i%100)/10)+int((i%1000)/100)+int(i/1000)+i
    if d<=5000:
        x[d-1]=0
print(sum(x))

1)숫자 각자리 수를 어떻게 합할지 고민하다가 저렇게 했는데 다른 분들 코드를 보니 문자열에서 for 돌리면 숫자 한개씩 가져오는군요.. 2)어떤 숫자의 generator는 반드시 어떤 숫자보다 작으므로, 1~5000 사이의 어떤 숫자a가 셀프넘버가 아니라면 반드시 a보다 작은 숫자 중에 generator가 있습니다. 3)그래서 1~5000을 가지는 리스트 x를 만들고, for 문을 통해 1~5000사이의 숫자를 d()의 넣은 결과들을 리스트 x에서 탈락시켜줍니다. 4)마지막으로 합하여 출력합니다.

2017/09/03 18:59

민훈

    public static int d(int n) {

        if (n<10) return n;
        return n%10 + d(n/10);
    }

    public static void main(String[] args) {

        int[] chk = new int[5001];

        // 제너레이터보다 낮은 숫자는 나오지 않기 때문에 5000 까지만 수행
        for (int i = 1; i < 5000 ; i++) {    
            int num = d(i);
            if(num+i < 5000) chk[num+i] = 1;
        }

        int sum = 0;
        for (int i = 1; i < 5000 ; i++) {
            if (chk[i] == 0) sum += i; 
        }

        System.out.println(sum);        
    }

2017/09/06 12:14

곽철이


def d(n):
    s_n=str(n)
    i=0
    list=[]
    list_sum=0
    while i<len(s_n):
        list.append(s_n[i])
        i=i+1
    for list_element in list:
        list_sum=list_sum+int(list_element)
    return list_sum+n


#1<n<4975 일때 d의 list--d(4975)=5000이므로 n의 범위를 저렇게 정함
d_number=[]
for n in range(1,4976):
    d_number.append(d(n))

#1~5000까지의 list
number=[]
for int_ in range(1,5001):
    number.append(int_)

#1~5000에서 d의 list값을 뺀 list(즉 self_number의 list)
for remove_num in d_number:
    if remove_num in number:    
        number.remove(remove_num)

self_number=number

#self_number의 합을 구하는 식
sum_selfnumber=0
for x in self_number:
    sum_selfnumber=sum_selfnumber+x

print(sum_selfnumber)

2017/09/09 23:39

루룰루랄라

include

using namespace std;

static const int N = 5000;

int d(int n) { int res = n; while (n != 0) { res += n % 10; n /= 10; } return res; }

int main() { bool isSelfNo[N + 1]; for (int i = 0; i <= N; i++) isSelfNo[i] = true; int sumOfSelfNo = 0; int n = 1; while (n <= N) { if (isSelfNo[n]) sumOfSelfNo += n; int _d = d(n); if (_d <= N) isSelfNo[_d] = false; n++; } cout << sumOfSelfNo << endl; }

2017/09/18 17:34

홍진욱

#include <iostream>
#include <vector>
#include <stack>
#include <math.h>

using namespace std;


int check_digit(int num) {
    int count = 0;
    while (1) {
        count++;
        if (num < pow(10, count))
            return count;
    }
}

int pick_num(int num, int digit) {
    int num1 = pow(10, digit);
    int num2 = pow(10, digit - 1);
    int result = (num%num1 - num%num2)/pow(10,digit-1);
    return result;
}

int d(int num) {
    int digit = check_digit(num);
    int result = num;
    for (int i = 1; i < digit + 1; i++) {
        result += pick_num(num, i);
    }
    return result;
}

vector<int> self_number(int num) {
    vector<int> v(num + 1, 1);
    for (int i = 0; i < num + 2; i++) {
        int num_d = d(i);
        if (num_d <= num)
            v[num_d] = 0;
    }
    return v;
}


int main() {
    int num = 10;
    cout << "Type number" << endl;
    cin >> num;
    vector<int> v = self_number(num);
    int sum = 0;

    for (int i = 0; i <= num; i++) {
        if (v[i] == 1)
            sum += i;
    }
    cout << "Sum of self numbers under" << num << " is : " << sum << endl;
}

2017/09/19 10:32

김기훈

'''Python the sum is 1227365''' def d(n): sumSTR=0 for i in list(str(n)): sumSTR+=int(i) return int(sumSTR)+n

a=[] for n in range(1,5000): if d(n)<=5000: a.append(d(n))

print(sum([x for x in range(1,5001) if x not in a]))

2017/09/21 23:15

Quan Lee

#include<stdio.h>

int main()
{
    int number, gen, gen_digit;
    int sum_of_digits, sum_of_self_numbers=0;

    for(number = 1 ; number <= 5000 ; number++)
    {
        for(gen = 1 ; gen < number ; gen++)
        {
            gen_digit = gen;
            sum_of_digits = 0;
            while(gen_digit)
            {
                sum_of_digits += gen_digit % 10;
                gen_digit /= 10;
            }

            if(number == (gen + sum_of_digits))
            {
                sum_of_self_numbers += number;
            }
        }//내부 for의 끝
    }//외부 for의 끝

    printf("1 ~ 5000 까지의 Self-number들의 합 : %d\n", sum_of_self_numbers);

    return 0;
}//main의 끝

2017/09/22 14:35

한승엽

public class ex1 {

public static void main(String[] args) {
    boolean[] gen = new boolean[5001];
    int a,b,c,d;
    int sum = 0;

    for(int i=1; i < 5001; i++) {
        a = (i/1000)%10;
        b = (i/100)%10;
        c = (i/10)%10;
        d = (i/1)%10;

        if(a+b+c+d+i <= 5000)
        gen[a+b+c+d+i] = true;
    }

    for(int i=1; i < 5001; i++) {

        if(gen[i] == false) {
            sum += i;
        }
    }

    System.out.println(sum);
}

}

2017/09/26 13:10

이병호

def getgen(n):
    s = n
    while n > 0 :
        s += n%10
        n //= 10
    return s

selnum = list(range(1,5001))
for i in range(1,5001):
    gen = getgen(i)
    if gen in selnum:
        selnum.remove(gen)

print(sum(selnum))

2017/09/26 23:21

YoonHee Choi

asum = set()
tsum = set()
for x in range(1, 5000):
    asum.add(x)
    tmp = str(x)
    sm = x;
    for z in tmp:
        sm += int(z)
    if sm < 5000:
        tsum.add(sm)

print(sum(asum - tsum))

2017/09/27 10:09

케빈

def generator(number):
    sum = number
    while number > 0:
        sum += number % 10
        number = number // 10

    return sum

gen_numbers = set()
values = set()
for n in range(1, 5000):
    values.add(n)
    gen_numbers.add(generator(n))

self_numbers = values - gen_numbers

sum = 0
for v in self_numbers:
    sum += v

2017/09/28 18:22

thanatoz

라이브러리 없이 단순 사칙연산 & OnOff로 해결했습니다.

public class generatorSum {
    public static void main(String[] args) {
        int sumResult = 0; boolean match = false;

        for(int selfNum = 1; selfNum < 5000; selfNum++) {
            for(int generator = 1; generator <= selfNum; generator++) {
                int generatorNum =
                        (generator / 1000)
                        +(generator / 100) % 10
                        +(generator / 10) % 10
                        +(generator % 10)
                        +generator;
                if(generatorNum == selfNum) {
                    match = true;
                }
            }
            if(match == false) {
                sumResult += selfNum;
            } else {
                match = false;
            }
        }
        System.out.println("Result : " +sumResult);
    }
}

2017/10/01 13:21

SungWook Jung

package problem.Korea.codingdojang;


//어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.

public class NexonTest {

    public static int selfNumberSum(int input) {
        int result = 0, i = 0, num_i = 0;
        int generatorCheck = 0;
        int[] selfNumber = new int[input];

        for(i=0; i<input; i++) {
            selfNumber[i] = 0;
        } // 셀프 넘버 일 경우 0으로 남도록 한다

        for(i=0; i<input; i++) {
            num_i = i+1;
            generatorCheck = num_i; // 제너레이터를 통해 만들어지는 숫자를 저장. 최초로 자신을 더하도록 한다
            while(num_i != 0) { // 각 자릿수를 더하도록 한다
                generatorCheck += num_i%10;
                num_i /= 10;            
            }
            if(generatorCheck <= input) {
                selfNumber[generatorCheck-1] = 1;
            }
        } // 제너레이터가 있는 숫자일 경우 1로 바꾸도록 한다

        for(i=0; i<input; i++) {
            if(selfNumber[i] == 0) {
                result += i+1;
            }
        } // 0이 담겨져 있는 숫자의 경우 셀프 넘버이므로 이 숫자를 result에 더하도록 한다


        return result;
    }

    public static void main(String[] args) {
        System.out.println(selfNumberSum(5000));

    }

}

2017/10/01 19:40

Choi WoongJin

generator_set = set()
union_set = set()


def get_generator_num(str_num):
    return sum(map(int, str_num)) + int(str_num)


for i in range(1, 5001):
    rval = get_generator_num(str(i))
    generator_set.add(rval)
    union_set.add(i)

print(sum(union_set - generator_set))

2017/10/02 20:07

androidDev

#include <iostream>
using namespace std;

int set[5000];

int main()
{
    for (int k = 0; k<5000; k++)
    {
        set[k] = k;
    }

    for (int c = 0; c<5; c++) // 천
    {
        for (int b = 0; b<10; b++) // 백
        {
            for (int s = 0; s<10; s++) // 십
            {
                for (int i = 0; i<10; i++) // 일
                {
                    int sum = 1000*c + 100*b + 10*s + i + (c+b+s+i);
                    if (sum<5000)
                    {
                        set[sum] = 0;
                    }
                }
            }
        }
    }

    int k = 0;
    int selfsum = 0;
    while (k<5000)
    {
        selfsum = selfsum + set[k];
        k = k+1;
    }

    cout<<selfsum;

    return 0;
}

C++ 배운지 얼마 안된 초보자가 써본 코드입니다. 코딩도장에서 푼 첫 문제입니다. 매우 느릴것같네요.

2017/10/04 19:07

장우영

def listrizer(i):
    list_ex = []
    j = len(str(i))
    for k in range(j):
        list_ex.append(int(str(i)[k]))
    return sum(list_ex, i)

list1 = []
list2 = []

for i in range(5001):
    k = listrizer(i)
    list1.append(k)

for i in range(5001):
    list2.append(i)

set1 = set(list1)
set2 = set(list2)
set3 = set2 - set1
list3 = list(set3)
list3.sort()


#print (list1)
#print (list2)
#print (set3)
#print (list3)
print (sum(list3))

2017/10/06 04:45

Yungbin Kim

public class Generator {

    public static void main(String[] args) {    
        int genSum = 0;

        for(int num = 1; num<5000; num++)
        {
            for(int num2 = 1; num2<500; num2++)
            {
                if(num == Gener(num2))
                {
                    break;
                }
                if(num2 == 499)
                {
                    genSum += num;
                }
            }
        }

        System.out.println(genSum);

    }

    public static int Gener(int a)
    {
        int num = a;
        int one = num / 1000;
        num -= one * 1000;
        int two = num / 100;
        num -= two * 100;
        int three = num / 10;
        num -= three * 10;
        int four = num;

        int sum = one + two + three + four;

        return sum + a; 
    }

}

2017/10/11 17:23

이왕근

    int array[6000] = { 0, };
    int sum = 0;
    for (int i = 1 ; i < 5000; i++)
    {
        int temp = i;
        while (temp)
        {
            sum += (temp % 10);
            temp /= 10;
        }
        array[sum + i] = sum + i;
        sum = 0;
    }

    for (int i = 0; i < 5000 ; i++)
        if (array[i] == 0) { sum += i; }

    cout << "결과값 : " << sum << endl;

2017/10/15 17:59

lim

include "stdio.h"

include "stdlib.h"

include "string.h"

include "stdbool.h"

define MAX_NUMBER 10000

int Generator(int number);

int main(void) { int sum = 0; bool selfNumber[MAX_NUMBER + 1]; memset(selfNumber, true, sizeof(selfNumber));

for (int i = 1; i <= MAX_NUMBER; i++) //1부터 10000까지 셀프넘버 검사
{
    int generator = Generator(i);

    if (generator <= MAX_NUMBER) // 셀프넘버 아님
        selfNumber[generator] = false;
}

for (int i = 1; i <= MAX_NUMBER; i++) //1부터 10000까지 셀프넘버라면 출력함
{
    if (selfNumber[i] == true)
    {
        printf("Self-Number found !!! : %d\n", i); //< 이부분이 원하는 답이겠네요.
                                                   // sum += i;
    }
}

//printf("Sum of Self-Number = %d\n", sum);//1~부터 10000 사이의 셀프넘버의 합을 출력함.

return 0;

}

int Generator(int number) { int total = 0; int mod;

total += number; // 일단 자신을 더한다.

while (number>0) // 자릿 수를 줄여가면서 첫번째 자리를 더한다.
{
    mod = number % 10;
    number = number / 10;
    total = total + mod;
}


return total;

}

2017/10/16 12:54

엄희영

package test;

public class test02 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int sum = 0;

    out : for(int i = 1; i < 5000; i++) // 5000까지 반복
    {
        for(int j = 1; j < i; j++)
        {
            if(i == Generator(j)) //제너레이터가 아니면
            {
                continue out;
            }
        }
        sum += i;
    }
    System.out.println(sum);
}
private static int Generator(int n) //제너레이터 구하기
{
    int x1 = n % 10; // 1의자리
    int x10 = (n / 10) % 10; //10의자리
    int x100 = (n / 100) % 10; //100의자리
    int x1000 = n / 1000; //1000의자리

    return n + x1 + x10 + x100 + x1000; //제너레이터 결과
}

}

2017/10/16 21:51

조병희

저는 해당 코드를 파이썬으로 작성했습니다. 우선 d(number) 함수를 작성한 뒤, 1에서 5000까지 순서대로 구성된 집합을 a집합으로, generated number을 b집합으로 정했습니다. 1에서 5000으로 만들어진 숫자 중에는 d(n)함수에 넣었을 때, 5000을 넘는 것이 있으므로 해당 숫자들은 제외하여 집합 b에 저장하였습니다. 그 다음, a집합과 b집합의 교집합을 제외한 나머지를 저장하여 self number_list를 만들고, sum함수를 이용하여 더하였습니다.

def d(number):
    sum = number
    for i in list(str(number)):
        sum += int(i)
    return sum

a = []
for i in range(1,5001):
    a.append(i)

b = []
for i in range(1,5001):
    if d(i) > 5000:
        break
    else:
        b.append(d(i))

selfnumber_list = set(a)^set(b)
print(sum(selfnumber_list))

2017/10/17 21:10

정재훈

#include <iostream>
using namespace std;

int main(){
    int Arr[5000];
    for (int i = 0; i < 5000; i++){
        Arr[i] = i + 1;
    }
    int number = 0;
    for (int i = 0; i < 5000; i++){
        number = i % 10 + i / 10 + i / 100 + i / 1000;
        Arr[number] = 0;
    }
    int total = 0;
    for (int i = 0; i < 5000; i++){
        total += Arr[i];
    }
    cout << total;
    return total;
}

2017/10/20 11:06

김동근


def dgen(n) :
    k = str(n)
    k = list(k)
    for i in k :
        n += int(i)
    return n

self = set(range(1,5000)) - set([dgen(i) for i in range(1,5000)])

print(sum(self))

2017/10/21 01:50

캘린더

public class Main {

    public static void main(String[] args) {
        int size = 4999;
        int[] a = new int[size];
        for(int i=0; i<size; i++){
                int gen = (i+1)/1000+((i+1)/100)%10+((i+1)/10)%10+(i+1)%10+i+1;
                if(gen < size) a[gen-1] = -1;
        }
        int sum=0;
        for(int i=0;i<size; i++){
            if(a[i]!=-1) sum = sum+i+1;
        }
        System.out.println(sum);
    }

}

2017/10/26 23:44

JaeYoon Lee

public class Generator {
    public static void main(String[] args) {
        ArrayList<Integer> allNum = new ArrayList<>();
        ArrayList<Integer> genNum = new ArrayList<>();
        ArrayList<Integer> selfNum = new ArrayList<>();

        final int num = 5000;
        int a, b, c, d, sum;
        a = b = c = d = sum = 0;

        for (int i = 1; i < num; i++) {
            allNum.add(i);
        }

        for (int i = 0; i < allNum.size(); i++) {
            a = allNum.get(i) % 10;
            b = (allNum.get(i) / 10) % 10;
            c = (allNum.get(i) / 100) % 10;
            d = allNum.get(i) / 1000;

            if (!genNum.contains(a + b + c + d + allNum.get(i))) {
                genNum.add(a + b + c + d + allNum.get(i));
            }
        }

        for (int i = 0; i < allNum.size(); i++) {
            if (!genNum.contains(allNum.get(i))) {
                selfNum.add(allNum.get(i));
            }
        }
        for (int i = 0; i < selfNum.size(); i++) {
            sum += selfNum.get(i);
        }
        System.out.println(sum);
    }

}

2017/10/27 17:17

Yongjun Kim

public static int sumNum(int n) { int result = 0; for(int i =1 ; i < n; i++){ for (int j = 1; j <= i; j++) { String test = j+""; int test2 =0; for (int k = 0; k < test.length(); k++) { test2 += Integer.parseInt(test.charAt(k)+""); } if (i == test2+j) { break; }else if(i ==j){ result += j; System.out.println(j); } } } return result; }

2017/11/03 13:31

kim

체감상 lv3 정도 되는 문제라고 생각합니다. 2는 아닌거 같은데.. 제 실력 부족이겠죠 ㅡㅜ 어찌됬든 풀었습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Nexon_Generator_
{
    class Program
    {
        static void Main(string[] args)
        {
            //각 자리 숫자 들과 자신을 더한 숫자
            int answer = 0;
            int divideNum = 1;
            int digit;
            List<int> list = new List<int>();

            for (int i = 1; i < 5000; i++)
            {
                while (i / divideNum >= 1) //자릿수들의 합
                {
                    digit = i % (divideNum * 10);
                    digit /= divideNum;
                    answer += digit;
                    divideNum *= 10;
                }
                list.Add(i + answer); //제너레이터가 있는수 저장
                divideNum = 1;
                answer = 0;
            }
            bool flag = false;
            answer = 0;
            list.Sort(); //오름차순 정렬
            for(int i = 0; i < 5000; i++)
            {
                foreach(int l in list)
                {
                    if(i == l) //셀프 넘버가 아닌수
                    {
                        flag = true;
                        break;
                    }
                    else if(i <= l)
                    {
                        break;
                    }
                }
                if(flag == true)
                {
                    flag = false;
                    continue;
                }
                //Console.WriteLine(i); //셀프 넘버 출력
                answer += i;
            }
            Console.WriteLine(answer);
        }
    }
}

2017/11/04 22:06

와디더

# 한글 처리 in Atom 1.21.1 + Anaconda(Python 3.6.3) on Mac
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')

# 어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.

print(sum(set(range(1, 5000)) - set([i + sum([int(number)
                                              for number in str(i)]) for i in range(1, 5000)])))

2017/11/04 22:43

Jace Alan

return sum(set(x for x in range(1,10)) - set(n + sum(map(int, str(n))) for n in range(1,10)))

2017/11/05 00:09

ShinGoo Kang

처음에는 def로 선언했지만, lambda가 좀더 축약된 표현이라서 수정함

def find_generator(input):
    str01 = str(input)
    num = 0
    for i in str01:
        num = num+int(i)
    num = num+int(input)
    return num
# 좀 더 간단하게 아래와 같이 수정
find_g = lambda x : x  + sum([int(n) for n in str(x)])

r_01 = [find_g(inx) for inx in range(5000)]
s_01 = set(r_01)
s_02 = set([n for n in range(1,5001)])

r_02 = list(s_02-s_01)
result = sum(r_02)
print(result)

2017/11/11 10:53

정진환

using System;
using System.Collections.Generic;
namespace Test
{
    class MainClass
    {

        public static void Main (string[] args)
        {
            int N = 5000;
            List<int> list = new List<int> ();
            for (int i = 0; i < N; i++)
                list.Add (i);
            list.Remove (0);
            for (int i = 1; i < N; i++) {
                if (list.Contains (dn (i)) == true) {
                    list.Remove (dn (i));
                } else {
                }
            }
            int l = 0;
            for (int i = 0; i < list.Count; i++) {
                l += list [i];
            }
            Console.WriteLine (l);
        }


        public static int dn (int n){
            int[] sep = separator (n);
            int r = n;
            for (int i = 0; i < sep.Length; i++) {
                r += sep [i];
            }
            return r;
        }

        public static int[] separator(int k)
        {
            string a = k.ToString();

            int[] ri = new int[a.Length];
            for (int i = 0; i < ri.Length; i++) {
                ri [i] = Convert.ToInt32 (a [i].ToString());
            }
            return ri;
        }
    }
}

2017/11/12 16:00

jwj312366

sum([x for x in range(1,5000) if x not in map(lambda a: sum([int(a) for a in str(a)])+a, range(1,5000))])

2017/11/13 13:00

김일목

include

int d(int n){ int first = 0; int sum =0;

for(int i=1000;i>0;i /10){ first = n / i; n -=(first * i); sum += first; }

return sum; }

int main(void){ int n=0; int generator =0

prinf("input : "); scanf("%d", &n);

generator = d(n); print("d(%d) = %d", n, generator); }

2017/11/13 14:01

방성민


int main()
{
    int i;
    int ghavnum=0 ;
    int arr[5000];
    int k;
    int total=0;

    for (i = 0; i < 5000; i++)
    {
        arr[i] = 0;
    }




    for (i = 1; i <= 5000; i++)
    {
        k = i;
        ghavnum = i;
        while (k > 0)
        {

            ghavnum += k % 10;
            k = k / 10;
        }
        if (ghavnum > 0 && ghavnum <= 5000)
        {
            arr[ghavnum - 1] = 1;
            printf("%d,", ghavnum);
        }


    }



    for (i = 0; i < 5000; i++)
    {
        if (arr[i] == 0)
            total += (i + 1);
    }

    printf("%d", total);

    getchar();
    return 0;

}

2017/11/18 13:22

junpil lee

def getSumAllDigit(num):
    numStr = str(num)
    result = 0;
    for digit in numStr:
        result += int(digit)
    return result

def d(num):
    for i in range(0, num):
        if(i > num) :
            return False # 제너레이터는 입력받은 숫자보다 클수는 없다
        elif(getSumAllDigit(i) + i == num) :
            return True
    return  False

MAX_NUM = 5000
#for i in range(1, MAX_NUM):
#    print(str(i) + "," + str(d(i)))

newList = [i for i in range(1, MAX_NUM) if d(i) == False]
print(sum(newList))

2017/11/20 10:48

Cley Park

const d = n => n + n.toString().split('').map(v => +v).reduce((s, v) => s + v);
const numbers = Array.from(Array(5000), (v, i) => i + 1);

for (let i = 1; i < 5000; i++) {
  numbers[d(i) - 1] = 0;
}

const result = numbers.reduce((s, v) => s + v, 0);

console.log(result, result === 1227365);

2017/11/22 14:44

huna

Common Lisp

(defun foo (max)
  (labels ((fun-gen (num)
           (+ num (apply #'+ (map 'list #'digit-char-p (prin1-to-string num))))))    

    (let ((num-list (loop for n from 1 below max collect n))
          (gen-list (loop for n from 1 below max collect (fun-gen n))))    

      (apply #'+ (set-difference num-list gen-list)))))
>(foo 5000)
>1227365

2017/11/23 01:14

리스프

li = []
exist=0
max1 = (4999 * 5000) / 2
for i in range(1,5000):
    g = i + sum([int(a) for a in str(i)])
    exist=0
    for j in li:
        if j == g:
            exist=1
            break

    if g >= 5000 or exist == 1:
        g = 0
    else:
        li.append(g)
    max1 = max1 - g


print(max1)


# 1227365

2017/11/23 02:02

김현서

def d(n):
    y = n
    while n > 0:
        y += n % 10
        n //= 10
    return y

Z = [d(n) for n in range(5000)]
A = [n for n in range(5000) if n not in Z]
print(sum(A))

2017/11/24 09:36

furor

import java.util.ArrayList;

public class Nexon {
    public static void main(String[] args) {
        Nexon N = new Nexon();
        ArrayList<Integer> generator = new ArrayList<>();
        int n=0;
        for(int i =0; i<5000;i++){
            generator.add(N.Generator(i));
        }
        for(int i = 0; i <= 5000; i++){
            if(generator.contains(i)){

            }else {
                n += i;
            }
        }
        System.out.println(n);
    }

    public int Generator(int n) {
        int answer = 0;
        int count=0;
        String[] num;
        num = String.valueOf(n).split("");
        int k = String.valueOf(n).length();
        for(int i = 0 ; i< k; i++){
            answer += Integer.parseInt(num[i]);
        }
        answer += n;
        return answer;
    }
}

2017/11/24 22:31

나아람

#include <iostream>
using namespace std;

inline int Generator(int num)
{
    int temp = num;
    while (1)
    {
        temp += num % 10;
        num /= 10;
        if (num == 0)break;
    }

    return temp;
}

class SelfNumbers
{
private:
    int Total;
    int *GeneratorNumber;
    int Size;
    int Number;

    void Allocate(int num)
    {
        Size++;
        GeneratorNumber = (int*)realloc(GeneratorNumber, sizeof(int)*Size);
        GeneratorNumber[Size - 1] = num;
    }

    bool Search(int num)
    {
        for (int i = 0; i < Size; i++)
            if (GeneratorNumber[i] == num)
                return false;
        return true;
    }

    void Update(int num)
    {
        if (Search(num))
            Allocate(num);
    }
public:

    void ViewSelfNumbersTotal()
    {
        for (int i = 0; i < Number + 1; i++)
        {
            if (Search(i) == true)
                Total += i;
        }
        cout << Total << endl;
    }

    SelfNumbers(int how)
        :Total(0)
        , GeneratorNumber(nullptr)
        , Size(0)
        , Number(how)
    {
        for (int i = 0; i < Number; i++)
            this->Update(Generator(i));
    }
    ~SelfNumbers()
    {
        free(GeneratorNumber);
    }
};


void main()
{
    SelfNumbers* SN;
    SN = new SelfNumbers(5000);
    SN->ViewSelfNumbersTotal();
    delete SN;

    system("pause");
}

visual studio 2017 C++

2017/11/27 14:50

Zee

U = range(1, 5001)

for num in range(1, 5001):
    i = ii = iii = iiii = 0

    i = num%10/1
    if num > 9:
        ii = num%100/10
        if num > 99:
            iii = num%1000/100
            if num > 999:
                iiii = num%10000/1000
    s = i+ii+iii+iiii+num
    if s in U:
        U.remove(s)

#print U[:20], "..."
print sum(U)

2017/11/27 19:13

탐나

d_fn = lambda n: n + sum([int(i) for i in str(n)])


generator = set(d_fn(i) for i in range(1, 5000))
y = set(range(1,5000))

ans = y.difference(generator)

print(sum(ans))

2017/11/27 23:06

Sung Kim

#include <stdio.h>
#include <math.h>
#include <memory.h>

class CDojo1_SelfNum
{
public:
    CDojo1_SelfNum() {};
    ~CDojo1_SelfNum() {};

    int Solve(int inputNum);

private:
    int CalGeneratorNum(int inputNum);
};

int CDojo1_SelfNum::CalGeneratorNum(int inputNum)
{
    int retVal = 0;

    int calNum = inputNum;
    int digit = 0;
    int modVal = 10;
    do
    {
        digit = (calNum % modVal);
        retVal += digit;
        calNum *= 0.1f;
    } while (calNum != 0);

    retVal += inputNum;

    return retVal;
}

int CDojo1_SelfNum::Solve(int inputNum)
{
    int retval = 0;

    const int AllocSize = inputNum + 1;
    bool* selfNumInfo = new bool[AllocSize];
    memset(selfNumInfo, true, sizeof(bool)*AllocSize);

    for (int i = 1; i <= inputNum; i++)
    {
        int GeneratorNum = CalGeneratorNum(i);
        if (GeneratorNum <= inputNum)
        {
            selfNumInfo[GeneratorNum] = false;
        }
    }

    for (int i = 1; i <= inputNum; i++)
    {
        if (selfNumInfo[i] == true)
            retval += i;
    }

    delete[] selfNumInfo;

    return retval;
}


int main()
{
    CDojo1_SelfNum exam;

    printf("%.2f\n", exam.Solve(5000));
}

2017/11/29 15:10

서상혁

def make_gen(num):
    self_num =[]
    not_self = []
    for n in range(num):
        gen_add =[]
        for i in range(len(str(n))):
             gen_add.append(int(str(n)[i]))
        not_self.append(sum(gen_add)+n)


    for x in range(num):
        if x not in not_self:
            self_num.append(x)

    return sum(self_num)

print (make_gen(5000))

2017/11/29 17:52

이경수

def d(n):
    res=n
    n=str(n)
    for i in n:
        res+=int(i)
    return res

count=0
number=list()
for gen in range(1,5000):
    number.append(d(gen))
for i in range(1,5000):
    if i not in number:
        count+=i
print(count)

2017/12/01 01:56

mongmong

allnum = set(range(1,5000))
snum = set()
result = 0

for i in range(1,5000):
    lennum = len(str(i)) + 1
    num = i

    for n in range(1, lennum):
        q, r = divmod(i, 10)
        num += r
        i = q

        if q == 0:
            snum.add(num)
            break

nonsnum = list(allnum - snum)

for a in nonsnum:
    result += a

print(result)

2017/12/03 19:20

김지호

data = []
for i in range (1, 5000) :
    tot = 0
    s = str(i)
    for j in range(0, len(s)) :
        tot += int(s[j])
    result = tot + i
    data.append(result)
# print(data)
r_data = []
for k in range (1, 5000) :
   if k in data : continue
   else :
       r_data.append(k)
print(sum(r_data))

2017/12/03 22:25

public static void main(String[] args) { calculateNumbersHasGenerator(); int sum = 0; for (int i = 0; i < 5001; i++) if (!hasGenerator(i)) sum += i; System.out.println("합 : "+sum); }

private static boolean hasGenerator(int num)
{
    return numbersHasGenerator.contains(num);
}

private static ArrayList<Integer> numbersHasGenerator;

private static void calculateNumbersHasGenerator()
{
    numbersHasGenerator = new ArrayList<Integer>();
    for (int i = 0; i <= 5000; i++)
    {
        String num = String.valueOf(i);
        int no = 0;
        for (int n = 0; n < num.length(); n++)
            no += Integer.parseInt(num.substring(n, n + 1));
        numbersHasGenerator.add(no + i);
    }
}

2017/12/04 14:39

떼디

public class Main{

    public static int selfNumberSum(int input) {
        int result = 0, i = 0, num_i = 0;
        int generatorCheck = 0;
        int[] selfNumber = new int[input];

        for(i=0; i<input; i++) {
            selfNumber[i] = 0;
        } // 셀프 넘버 일 경우 0으로 남도록 한다

        for(i=1; i<=input; i++) {
            num_i = i;
            generatorCheck = num_i; // 제너레이터를 통해 만들어지는 숫자를 저장. 최초로 자신을 더하도록 한다
            while(num_i != 0) { // 각 자릿수를 더하도록 한다
                generatorCheck += num_i%10;
                num_i /= 10;            
            }
            if(generatorCheck <= input) {
                selfNumber[generatorCheck-1] = 1;
            }
        } // 제너레이터가 있는 숫자일 경우 1로 바꾸도록 한다

        for(i=0; i<input; i++) {
            if(selfNumber[i] == 0) {
                result += i+1;
            }
        } // 0이 담겨져 있는 숫자의 경우 셀프 넘버이므로 이 숫자를 result에 더하도록 한다


        return result;
    }

    public static void main(String[] args) {
        System.out.println(selfNumberSum(5000));

    }

}

2017/12/06 00:04

유진

hab = 0
sel = 0
glo = 0
for i in range(1,5000): 
   for a in range(0,i):
       hab+=a
       gen=str(a)
       for j in range(len(gen)):
           hab+=int(gen[j])
       if(hab == i):
         sel = 1
       hab = 0
   if(sel == 0):
       print(i)
       glo += i
   sel = 0
print(glo)

2017/12/08 18:44

redshark

selfNumbers = []

arr = []
genNumbers = range(1, 5000)

for v1 in genNumbers:
    str_v1 = str(v1)
    digits = len(str_v1)

    mySum = 0;
    for idx in range(0, digits):
        mySum = mySum + int(str_v1[idx])
    mySum = mySum + v1
    arr.append(mySum)

for idx in range(1, 5000):
    cnt = arr.count(idx)
    if cnt == 0:
        selfNumbers.append(idx)        

print("===============================")
print("합계: " + str(sum(selfNumbers)))

2017/12/11 14:33

이형영

def dg(num):
    return(sum(list(map(int, list(str(num)))))+num)

nums=set(range(1, 5000))
summ=0
n=1
while summ<=4999:
    summ=dg(n)
    nums=nums-{summ}
    n+=1

print(sum(nums))

2017/12/13 15:09

빗나감

def d(n):
    sum_x = 0
    str_n = str(n)
    for x in str_n:
        sum_x = sum_x + int(x)
    return sum_x + n

mb = []
for x in range(1,5000):
    if d(x) < 5000:
        mb.append(d(x))

pr = 0
for k in list(range(1, 5000)):
    if k not in mb:
        pr = pr + k
print(pr)

2017/12/14 18:58

홍철현

2시간 만에 겨우 풀었네요..완전 노가다로 푼듯ㅠㅠ

package programming;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class nexon {

    public static void main(String[] args) {

        int self=1,i;
        int result = 0;
        long sum=0;
        int x=1;


        int arr[] = new int[5000];

        for(i=1;i<5000;i++)
            arr[i] = i;

        while(genCalc(x)<5000){
            int index;

            index = genCalc(x);

            if(arr[index]==genCalc(x))
                arr[index] = 0;


            x++;
        }

        for(i=1;i<arr.length;i++){
            if(arr[i]!=0)
                sum+=arr[i];
        }


        System.out.println(sum);
    }

    static int genCalc(int x){
        int gen = 0;

        if(x>=1000)
            gen = (x/1000)+(x%1000)/100 + ((x%1000)%100)/10 + ((x%1000)%100)%10 + x;
        else if(x>=100)
            gen = (x/100)+(x%100)/10 + (x%100)%10 + x;
        else if(x>=10)
            gen = (x/10)+(x%10)+x;
        else if(x<10)
            gen = (x%10)+x;

        return gen;
    }

}

2017/12/17 21:22

쫑티

파이썬 공부하고 처음 풀어봐요. 파이썬3 입니다.

def d(n):
    return sum(int(x) for x in str(n)) + n
nums = list(range(1, 5000))
for n in range(1, 5000):
    try:
        nums.remove(d(n))
    except:
        pass
print(sum(nums))

2017/12/20 15:50

노혁신

def generator(number):
    factornum = 0
    for i in range (len(str(number))):
        factornum = factornum + int(str(number)[i])
    factornum += number
    return factornum

def whichoneiswhich(limitation1,limitation2):
    result = 0
    # make a list that contains from 1 to limitation1.
    possiblefactornum = []
    for i in range(1,limitation1+1):
        possiblefactornum.append(i)
    for k in range(1,limitation2+1):
        generator(k)
        try: possiblefactornum.remove(generator(k))
        except: ValueError
    for j in possiblefactornum:
        result += j
    return result

print(whichoneiswhich(5000,10000))

2017/12/22 11:46

01503805

#define MAX(x, y) ((x) > (y) ? (x) : (y))
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int IsSelfNumber(int i) {
    for (int j = MAX(1, i-31); j < i; j++) { // 31: 자리수 합의 최댓값
        char strj[5];
        _itoa(j, strj, 10);
        int sum = j;
        for (int k = 0; k < strlen(strj); k++) 
            sum += (strj[k] - '0');
        if (sum == i)
            return 0;
    }
    return 1;
}

void main() {
    int result = 0;
    for (int i = 1; i < 5000; i++) {
        if (IsSelfNumber(i))
            result += i;
    }
    printf("%d\n", result);
}

2017/12/22 14:31

ccs

public class find_selfNumber {
    public static int dN(int n) {
        int th = n/1000;
        int h = (n-th*1000)/100;
        int t = (n-th*1000-h*100)/10;
        int o = (n-th*1000-h*100-t*10);
        return n+th+h+t+o;
    }
    public static void main(String[] args) {

        // 1부터 5000까지의 값이 들어있는 배열 생성
        int[] test = new int[5000];
        for(int i=0; i<5000; i++) {
            test[i]=i+1;
        }
        // test배열과 비교하기 위한 배열 생성
        int[] contrast = new int[5000];
        for(int i=0; i<5000; i++) {
            contrast[i]=i+1;
        }
        // dN(test[i]) 와 contrast[j]가 같은 경우를 따져본다
        for(int i=0; i<5000; i++) {
            for(int j=i; j<5000; j++) {
                if(dN(test[i]) == contrast[j]) {
                    // 만약 제너레이트 넘버를 찾을 경우 0으로 바꾼다
                    contrast[j]=0;
                }
                else
                    // 제너레이트 넘버를 못찾으면 다음 contrast```{.java}
public class find_selfNumber {
    public static int dN(int n) {
        int th = n/1000;
        int h = (n-th*1000)/100;
        int t = (n-th*1000-h*100)/10;
        int o = (n-th*1000-h*100-t*10);
        return n+th+h+t+o;
    }
    public static void main(String[] args) {

        // 1부터 5000까지의 값이 들어있는 배열 생성
        int[] test = new int[5000];
        for(int i=0; i<5000; i++) {
            test[i]=i+1;
        }
        // test배열과 비교하기 위한 배열 생성
        int[] contrast = new int[5000];
        for(int i=0; i<5000; i++) {
            contrast[i]=i+1;
        }
        // dN(test[i]) 와 test[j]가 같은 경우를 따져본다
        for(int i=0; i<5000; i++) {
            for(int j=i; j<5000; j++) {
                if(dN(test[i]) == contrast[j]) {
                    // 만약 제너레이트 넘버를 찾을 경우 0으로 바꾼다
                    contrast[j]=0;
                }
                else
                    // 제너레이트 넘버를 못찾으면 다음 test[j]와 따져본다
                    continue;
            }
        }
        // for문이 끝나면 배열에는 셀프넘버만 남는다

        int sum=0;
        for(int i=0; i<5000; i++) {
            sum += contrast[i];
        }
        System.out.println(sum);

    }
}

```[j]와 따져본다
                    continue;
            }
        }
        // for문이 끝나면 배열에는 셀프넘버만 남는다

        int sum=0;
        for(int i=0; i<5000; i++) {
            sum += contrast[i];
        }
        System.out.println(sum);

    }
}

2017/12/23 13:55

김기덕

tot_gen= (list(x+sum(int(x) for x in list(str(x))) for x in range(1,5000) if x+sum(int(x) for x in list(str(x))) <5000 ))
sum(set(range(1,5000)) - set(tot_gen))

2017/12/24 16:12

얏홍

R로 작성하였습니다. 아직 내장함수를 많이 익히지 못해서 소스코드가 지저분하네요. 좋은문제 감사합니다.

generator<-function(n){
    pos <- 10
    total <-n
    while(n){
      total<-total+n%%pos
      n<-n%/%pos
    }
    total
}

selfnum<-1:4999

i=1
while(i){
  if(generator(i)>=5000){
    break
  }
  else{
    selfnum[generator(i)]<-0
    i<-i+1
  }
}

sum(selfnum)

2017/12/27 00:20

SeongBeom Hong


def self_num(a):
    s = str(a)
    i = 0
    sum = 0
    while i < len(s):
        sum += int(s[i])
        i += 1

    return sum+a

l2 = set(list(i for i in range(1,5000)))
l = set(list(self_num(i) for i in range(1,5000)))

l3 = list(l2 - l)
print(l3[0])

sum = 0
for i in range(len(l3)):
    sum += l3[i]

print(sum)

2017/12/27 20:47

이준우

list = []
set1 = set([])
for i in range(1, 5000):
    d = 0
    d += sum(int(str(i)[j]) for j in range(len(str(i))))
    d += i
    list.append(d)
for i in range(1,5000):
    set1.add(i)
print(sum(set1 - set(list)))

2017/12/29 21:51

김호현

#include <stdio.h> 
int main(void)
{
    int self[5000] = { 0 };  //index값이 제너레이터가 있으면 true 1
    int total = 0; //셀프 넘버의 합 저장 
    for (int i = 1; i < 5000; i++)  //1~5000까지 반복
    {
        for (int j = 1; j < i; j++) {  
            if ((j + (j / 10) + (j % 10)) == i) {  //제너레이터가 있으면
                self[i] = 1;  //self값은 true
                break;
            }
        }
        if (self[i] == 0) {  //제너레이터가 없으면 = 셀프넘버이면
            total += i;  //total에 i값 더하기
        }
    }
    printf("%d\n", total);  //total값 출력
    return 0;
}

2017/12/30 16:01

김수경

파이썬 3.6

def d(n):
    nums = str(n)
    numint = []
    for i in nums:
        numint.append(int(i))
    return sum(numint) + n

def selfnumtotal(n):
    dnumset = set()
    selfnum = []
    for i in range(1,n):
        dnumset.add(d(i))

    for i in range(1,n):
        if not i in dnumset:
            selfnum.append(i)

    print(" 1 ~ %d 사이 셀프넘버들의 합 = "%n, sum(selfnum))

n = int(input(" ▶ 자연수 n을 입력하세요: n = "))            
print("\n")

selfnumtotal(n)

*결과값

 ▶ 자연수 n을 입력하세요: n = 5000


 1 ~ 5000 사이 셀프넘버들의 합 =  1227365

2017/12/31 22:28

justbegin

안녕하새오 코딩도장 첫 풀이애오 이거 한줄로 하신 분 존경스러워오

def d(n):
    str_n = str(n)
    d = n
    for i in str_n:
        d = d+int(i)
    return d

A = set(range(1, 5000))
B = set()
for x in range(1, 5000):
    B.add(d(x))
print(sum(A-B))

2018/01/02 00:16

HS

Glist=[]
for i in range(1,92):
    gene=i
    for j in range(len(str(i))):
        gene=gene+int(str(i)[j])
    Glist.append(gene)

result=0
for k in range(1,5001):
    if k not in Glist:
        result=result+k
print(result)

2018/01/02 17:27

Ilhoon Kang

import java.util.ArrayList;

public class generator {

    final int MAX = 5000;
    StringBuilder sb = new StringBuilder();
    ArrayList<Integer> generator = new ArrayList<>();

    public generator() {

    }

    public void getGenerator() {
        int tmpSum = 0;
        for (int i = 1; i <= MAX; i++) {
            sb.append(i);
            for (int j = 0; j < sb.length(); j++) {
                tmpSum += Integer.valueOf(sb.substring(j, j + 1));
            }
            generator.add(tmpSum + i);
            sb.delete(0, sb.length());
            tmpSum = 0;
        }
    }

    public int getSelfNum() {
        int sum = 0;
        for (int i = 1; i <= MAX; i++) {
            if (generator.contains((int) i)) {
                continue;
            } else {
                sum += i;
                //System.out.println(i);
            }
        }
        return sum;
    }

    public static void main(String[] args) {
        generator gen = new generator();
        gen.getGenerator();
        int sum = gen.getSelfNum();
        System.out.println(String.valueOf(sum));
    }
}

getSelfNum() 함수 안에서 //System.out.println(i) 주석을 제거 해주시면 값도 출력됨니다...

2018/01/04 17:22

강승규

d(n) 구하는 함수는 str()을 이용해서 구현 하였습니다.

def df(n):
    return n + sum([int(s) for s in str(n)])

sums = []
for i in range(5000):
    sums.append(i)

for i in range(5000):
    try:
        sums.remove(df(i))
    except:
        ...

print(sum(sums))

2018/01/04 20:36

Kim yeon hui

def d(number): total = 0 for i in str(number): total += int(i) total += int(number) return total sum(set(range(1,5000))-{d(i) for i in range(1,5000)})

2018/01/05 00:48

Oh Suhyeon

#셀프넘버 구하기.py

def numSplitSum(num):
    nToString = str(num)
    nToString.split()
    sumNum = num
    for i in nToString:
        sumNum += int(i)
    return sumNum


#본 프로그래밍
splitSumList = []
selfNumList = []
selfNumSum = 0

for i in range(1,5000):
    splitSumList.append(numSplitSum(i))

for s in range(1,5000):
    if s in splitSumList:
        pass
    else:
        selfNumList.append(s)


for i in selfNumList:
    selfNumSum += i
print(selfNumSum)

2018/01/06 19:44

권영재

파이썬

def G(N):
    NL = list(N)
    return int(N) + sum([int(NL[i]) for i in range(len(NL))])

non_self_numbers = [G(str(i)) for i in range(4975)]

self_numbers = set(range(0, 5000)) - set(non_self_numbers)

print(sum(self_numbers))

2018/01/09 11:43

이택성

자바

package cddj;
import java.util.Set;
import java.util.HashSet;

public class cddj_lv2_01 {
    public static void main(String[] args) {
        Set<String> no_self_nums = new HashSet<>();
        for (int i = 0; i < 5000; i++) {
            no_self_nums.add(String.valueOf(generator(String.valueOf(i))));
        }
        Set<String> self_nums = new HashSet<>();
        for (int i = 0; i < 5000; i++) {
            self_nums.add(String.valueOf(i));
        }
        self_nums.removeAll(no_self_nums);

        String[] ans = self_nums.toArray(new String[self_nums.size()]);
        System.out.println(sum(ans));
    }
    public static int sum(String[] NL) {
        int a = 0;
        for (String i : NL) {
            a += Integer.valueOf(i);
        }
        return a;
    }
    public static int generator(String N) {
        String[] NL = N.split("");
        return Integer.valueOf(N) + sum(NL);
    }
}

2018/01/09 13:17

이택성

public class level_2_nexon_interview_again {

public static void main(String[] args) {

    int four = 0, three = 0, two = 0, one = 0, sum = 0, sumall = 0;

    boolean[] array = new boolean[5000];

    for(int i = 0; i < 5000; i++)
    {
        four = i / 1000; // 4번째 자리 숫자.
        three = (i / 100) % 10; // 3번째 자리 숫자.
        two = (i / 10) % 10; // 2번째 자리 숫자.
        one = i % 10; // 1번째 자리 숫자.

        sum = four + three + two + one + i; // d(n)

        if(sum >= 1 && sum < 5000)
        {
            array[sum] = true; // d(n) 값 저장.

        }
    }

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

}

다 카피해버렸네요. 나중에 잊으면 다시 해봐야겠어요. 좋은방법 배워갑니다.

2018/01/15 16:33

Byam_Gyu

#include <iostream>
#include <string>
#include <sstream>
#include <list>

#define MAXNUM 5000

using namespace std;

void GeneratorFunc(string str);

list<int> temp;

int main()
{
    int final_result = 0;

    for (int i = 1; i < MAXNUM; i++)
    {
        temp.push_back(i);
    }
    list<int>::iterator iterPos = temp.begin();
    list<int>::iterator iterEnd = temp.end();

    for (; iterPos != iterEnd; iterPos++)   
    {
        stringstream sstr;
        sstr << *iterPos;
        GeneratorFunc(sstr.str());
        iterEnd = temp.end();                     // change end_Pos
    }

    iterPos = temp.begin();                       // initial begin_Pos
    for (; iterPos != iterEnd; iterPos++)
    {
        final_result += *iterPos;
    }

    cout << final_result << endl;
    return 0;
}

void GeneratorFunc(string str_num)
{
    int sum = 0;
    int result;

    for (int i = 0; i < str_num.size(); i++)     // each sum
    {
        sum += (str_num.at(i) - '0');
    }
    result = sum + stoi(str_num);                // final data

    if (result < MAXNUM)
    {
        stringstream sstr;
        temp.remove(result);
        sstr << result;
        GeneratorFunc(sstr.str());               // change to str and recursive
    }
}

어설프게 짜봤는데 복잡도가 높아서 그런지 너무 오래걸리네요ㅜㅜㅜ 재귀함수 기반으로 작성했으며 1~4999를 list에 넣어놓고 generator 함수로 만들어지는 값들은 다 빼는 형식으로 짰습니다. 최종적으로 남는 수를 모두 다 더했구요! 손봐주실분 있나요???? thread 쓰면 될까요???

2018/01/18 15:49

조인택

R로 풀었습니다.

```{r}
v<-NULL
for(i in 1:5000){
  v<-c(v, i+i%%10+i%/%10%%10+i%/%100%%10+i%/%1000%%10)
}
unique(v)
sum(setdiff(c(1:5000), unique(v)))

```

2018/01/19 10:50

Seunghyuck Kim

daum<-function(x,y){
    tmp <- NULL
    for(i in x:y){
      tmp[i] <- sum(as.numeric(c(unlist(strsplit(as.character(i),split=character(0))),i)))
    }
    print(setdiff(c(1:5000),tmp))
    print(sum(setdiff(c(1:5000),tmp)))
  }

2018/01/19 11:35

Dong-il kim

R알못입니다ㅜㅜ..

gen<-data.frame(index=FALSE,value=1:5000)
for(i in 1:5000){
    ifelse(i<10,
    gen[i*2,]$index<-TRUE,
            ifelse(i<100,
            gen[i+i%%10+i%/%10,]$index<-TRUE,
                    ifelse(i<1000&&i+i%%10+i%/%10<5000,
                    gen[i+i%/%100+i%%10+i%%100%/%10,]$index<-TRUE,
                        ifelse(i+i%/%1000+i%%10+i%/%100%%10+i%/%10%%10<5000,
                        gen[i+i%/%1000+i%%10+i%/%100%%10+i%/%10%%10,]$index<-TRUE, NA
                        ))))
}
sum(gen[gen$index==FALSE,]$value)

2018/01/19 17:37

_ “Barnacle” _

#include <stdio.h>

int main()
{
    bool arr[5000] = { 0 };
    int x, i, j;

    for (i = 0; i < 5000; i++)
    {
        j = i;
        for (x = i; x > 0; x /= 10)
        {
            j += x % 10;
        }
        arr[j - 1] = true; // index는 0~4999이므로 1을 뺀 인덱스를 true로 함.
    }

    j = 0;
    for (i = 0; i < 5000; i++)
    {
        if (!arr[i]) j += i + 1;
    }

    printf("Sum = %d", j);
    return 0;
}

2018/01/22 21:11

psvm

#include <iostream>

int sumOfSelfNumbers(int max) {

    bool* selfNumMask = new bool[max];

    memset(selfNumMask, 1, sizeof(bool) * max);

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

        int d = i + 1;
        int n = i + 1;

        while (n > 0) {
            d += n % 10;
            n /= 10;
        }
        if (d <= max) {
            selfNumMask[d - 1] = false;
        }
    }

    int sum = 0;
    for (int i = 0; i < max; i++) {
        sum += (selfNumMask[i] == 1 ? i + 1 : 0);
    }
    delete[] selfNumMask;

    return sum;
}

int main()
{
    std::cout << sumOfSelfNumbers(5000) << std::endl;
    return 0;
}

2018/01/22 22:44

엉큼한거북이

def s_n(n):
  res = int(n)
  cnt = str(n)
  for i in cnt:
    res += int(i)
  return res

numbers = [x for x in range(1, 5000)]
tmp = [s_n(n) for n in numbers]
for i in numbers:
  if i not in tmp:
    print(i)

2018/01/24 17:39

이주하

import numpy as np

generator = set([])
selfNum = set([x for x in range(1,5000)])

for i in range(1,5000):
    if i<10:
        generator.add(i+i)
    elif (10<=i and i<100):
        generator.add(i + i%10 + i//10)
    elif (100<=i and i<1000):
        generator.add(i + i//100 + ((i%100)//10) + i%10)
    else:
        generator.add(i + i//1000 + (i//100)%10 + (i%100)//10 + i%10)

result = selfNum - generator
a = list(result)

a = np.array(a)
print(a.sum())

순수하게 제가 짜봤는데 다른 고수 분들에 비해 매우 지저분하네요... 한수 배우고 갑니다.

2018/01/24 21:56

오리

#include<iostream>
#define MAX 5000
using namespace std;

void main() {
    int G[MAX];
    int N[MAX];
    int one, two, three, four;
    int sum = 0;

    for (int i = 0; i < MAX; i++)
    {
        G[i] = i ;
    }

    for (int i = 0; i < MAX; i++)
    {
        if (i < 10)
        {
            N[i] = G[i] * 2;
        }
        else if (i < 100)
        {
            two = G[i] / 10;
            one = G[i] % 10;
            N[i] = one + two + G[i];
        }
        else if (i < 1000)
        {
            three = G[i] / 100;
            two = (G[i] % 100) / 10;
            one = G[i] % 10;
            N[i] = one + two + three + G[i];
        }
        else {
            four = G[i] / 1000;
            three = (G[i] % 1000) / 100;
            two = (G[i] % 100) / 10;
            one = G[i] % 10;
            N[i] = one + two + three + four + G[i];
        }
    }

    for (int i = 0; i < MAX; i++)
    {
        for (int j = 0; j < MAX; j++)
        {
            if (N[i] == G[j]) { G[j]=0; }
        }
    }

    for (int i = 0; i < MAX; i++)
    {
        if (!G[i] == 0)
        {
            sum += G[i];
        }
    }
    cout << sum << endl;
}

C++로 작성했습니다.. 무작정 for문으로만 돌렸네요 어떻게 고쳐야할지 알려주세요!

2018/01/25 22:51

JM

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 넥슨입사문제
{
    class Program
    {
        static void Main(string[] args)
        {
            //91을 d(91)의 제네레이터
            List<int> selfNumList = new List<int>();
            List<int> notSelfNumList = new List<int>();

            int testNum = 1;
            while (testNum<5000)
            {            

                int data = CalGenerator(testNum);              
                notSelfNumList.Add(data);            
                testNum++;
            }

            for(int i = 0; i < 5000; i++)
            {
                if (notSelfNumList.Contains(i) == false)
                {
                    selfNumList.Add(i);
                }
            }

            int sum = 0;
            for(int i = 0; i < selfNumList.Count; i++)
            {
                sum += selfNumList[i];
            }

            Console.WriteLine(sum);


        }
        //846

        static int CalGenerator(int Input)
        { 
            int originNum = Input; 
            int countNum = 0;

            while (Input >= 10)
            {
                countNum += Input % 10;              
                Input /= 10;
            }
            countNum += Input;
            countNum += originNum;

            return countNum;

        }


    }
}

2018/01/26 06:05

박용진

package selfNumber;

import java.util.ArrayList;
import java.util.stream.IntStream;

public class SelfNumber {

    private long selfNumber() {

        int[] arr = new int[5001];
        ArrayList<Integer> list = new ArrayList<Integer>();
        int result = 0;

        for (int i = 1; i < 5000; i++) {
            int temp = getGenerator(i);

            if (temp < 5000){
                arr[temp] = temp;
                list.add(temp);
            }

            if(!list.contains(i))
                result += i;

        }
        result += 5000;

        System.out.println("result: " + result);
        return factorial(5000) - (IntStream.of(arr).mapToLong(ele -> ele).sum());
    }

    public long factorial(int n) {
        long temp = 0;

        for (int i = 1; i <= n; i++)
            temp += i;

        return temp;
    }

    public int getGenerator(int n) {
        int result = 0;

        String str = Integer.toString(n);

        for (int i = 0; i < str.length(); i++)
            result += Integer.parseInt(str.substring(i, i + 1));

        return result+n;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SelfNumber sn = new SelfNumber();

        System.out.println("result: " + sn.selfNumber());
    }

}

2018/01/29 18:29

김치우

var _array_1 = new Array;

for (var i = 1; i < 5001; i = i+1) {
  _array_1.push(i);
};


function _set_sum (i) {
  var _str_i = String(i);
  var _sum = 0;
  for (var i2 = 0; i2 < _str_i.length; i2++) {
    _sum = _sum + parseInt(_str_i[i2]);
  }
  var _sum_conclusion = _sum + i;
  return _sum_conclusion;
}

var _array_2 = new Array;
for (var i = 1; i < 5001; i = i+1) {
 _array_2.push(_set_sum(i));
  }

var _array_3 = new Array;
for ( var i = 0; i < _array_1.length; i = i + 1) {
  _array_3[i] = _array_1[i];
}


for (var i = 0; i < 5000; i = i+1) {
   _array_3[_array_2[i]-1] = 0;
 }

var _sum_fin = 0;
for (var i = 0; i < 5000; i = i+1) {
  _sum_fin = _sum_fin + _array_3[i];
}

console.log(_array_1);
console.log(_array_2);
console.log(_array_3);
console.log(_sum_fin);

2018/01/31 10:17

Yungbin Kim

ㅇㄴㄹㄴㅇㄹ

2018/02/01 02:08

박용현

org_list=[]
gen_list=[]
pre_gen=[]
def han(a):
    b=int(a)
    for i in range(len(a)):
        i=int(i)
        c=int(a[i])
        b+=c
    return b

for i in range(4977):
    pre_gen.append('%d' %(i+1))

for i in range(4977):
    gen_list.append(han(pre_gen[i]))

for i in range(5000):
    org_list.append(i+1)

set_org_list=set(org_list)
set_gen_list=set(gen_list)
answer= set_org_list-set_gen_list
print answer

arg=list(answer)
arg.sort()
print arg

2018/02/01 12:14

Kyung seok Oh

m = int(input("범위 : "))
def generate(n):
    a = str(n)
    result = n
    for i in a:
        result += int(i)
    return result
def gen(n):
    b = set()
    c = set(range(1,n+1))
    for i in range(1,n+1):
        b.add(generate(i))
    result = sum(c.difference(b))
    return result
print(gen(m))

2018/02/04 15:53

김동하

# 파이썬

not_self = set()

for t in range(1, 5001):
    m = t
    for u in str(t):
        m += int(u)
    not_self.add(m)

self_numbers = set(range(1, 5001)) - not_self
print(sum(self_numbers))

2018/02/04 17:02

olclocr

#include <stdio.h>

int d(int num);

main()
{
    int gen[5000];
    int num;
    int dx;
    int att = 0;
    int *p;
    int sum = 0;

    p = &att;

    for (num = 0; num < 5000; num++)
    {
        gen[num] = d(num + 1);
    }

    for (num = 0; num<5000; num++)
    {
        for (dx = 0; dx < 5000; dx++)
        {
            *p = 0;

            if (gen[dx] == num + 1)
                break;

            *p = dx;
        }

        if (att == 4999)
        {
            sum += (num + 1);
        }
    }
    printf("%d\n", sum);
}

int d(int num)
{
    int b[4] = { 0 };

    b[0] = num / 1000;
    b[1] = (num - (b[0] * 1000)) / 100;
    b[2] = (num - (b[0] * 1000) - (b[1] * 100)) / 10; 
    b[3] = (num - (b[0] * 1000) - (b[1] * 100) - (b[2] * 10)); 

    return b[0] + b[1] + b[2] + b[3] + num;
}

C언어로 해봤는데, C언어가 코드삽입 가능한 언어에 없나요..?ㅠㅠ

2018/02/04 22:38

올빼미

selfNumSet = []
selfNumTotal = 0

def getNum(num):
    total = num
    StrNum = str(num)
    for i in  StrNum:
        total += int(i)
    return total


for i in range(1, 5000):
    selfNumSet.append(getNum(i))

for i in range(1, 5000):
    if not i in selfNumSet:
        selfNumTotal += i

print(selfNumTotal)

2018/02/06 19:00

ohmazing5

#!/usr/bin/perl

use strict;

my @count;
my $sum;

foreach(1...5000) {
        my $generator = $_;
        $generator += $_ for split //;
        $count[$generator]++;
        $sum += $_ if $count[$_] < 1;
}

print "$sum\n";

2018/02/06 20:31

김펄

import java.util.*;

public class Main {

public static ArrayList generate() {
    int quot=0;
    int remain;
    int sum=0;
    int dn=0;
    ArrayList<Integer> arr=new ArrayList();
    for(int i=1; i<5000; i++) {
        quot=i;
    while(quot!=0) {
        remain=quot%10;
        quot=quot/10;
        sum=sum+remain;
    }
    dn=sum+i;
    sum=0;
    arr.add(dn);
    }
    return arr;
}
public static void main(String[] args) {
Scanner scanf=new Scanner(System.in);
    int sum=0;
    ArrayList<Integer> arr=new ArrayList();

    for(int i=1; i<5000; i++) {
            if(!generate().contains(i)) {
                sum=sum+i;
            }
    }
    System.out.println(sum);
}

}```{.java}

```

2018/02/07 17:22

즈스크

자바입니당

package CodingDojang;
import java.util.*;

public class DGenerator {

    final static int DIVISOR = 10;
    final static int MAX = 5000;

    public static int d(int n) {
        int result = n;
        int quotient = n / DIVISOR;
        int remainder = n % DIVISOR;

        result += remainder;
        while(quotient != 0) {
            remainder = quotient % DIVISOR;
            result += remainder;
            quotient /= DIVISOR;
        }
        return result;
    }

    public static void main(String args[]) {
        HashSet<Integer> nonSelfNumbers = new HashSet<Integer>();
        HashSet<Integer> oneToMaxSum = new HashSet<Integer>();
        int sum = 0;

        for(int n = 1; n < MAX; n++) {
            oneToMaxSum.add(n);
        }

        for(int n = 1; n < MAX; n++) {
            if(d(n) < MAX) {
                nonSelfNumbers.add(d(n));
            }
        }

        oneToMaxSum.removeAll(nonSelfNumbers);

        Iterator it = oneToMaxSum.iterator();
        while(it.hasNext()) {
            sum += (int)it.next();
        }

        System.out.printf("%d", sum);
    }
}

2018/02/07 22:58

sangw0804

func <- function(x){ d <- function(y){ k <- trunc(log(y, base=10)) + 1 n <- 0 for(j in 1:k){ n <- n + trunc(y%%10^j/10^(j-1)) } n <- n + y return(n) }

i <- 1 cn <- NULL repeat{ if(d(i) > x){ cn <- sort(unique(cn)) break }else{ cn[i] <- d(i) i <- i + 1 } }

return(sum(1:x) - sum(cn)) } func(5000)```{.r} func <- function(x){ d <- function(y){ k <- trunc(log(y, base=10)) + 1 n <- 0 for(j in 1:k){ n <- n + trunc(y%%10^j/10^(j-1)) } n <- n + y return(n) }

i <- 1 cn <- NULL repeat{ if(d(i) > x){ cn <- sort(unique(cn)) break }else{ cn[i] <- d(i) i <- i + 1 } }

return(sum(1:x) - sum(cn)) } func(5000) ```

2018/02/08 19:01

Job Kang

print(sum(set(range(1,5000))-set(map(lambda x:eval(str(x)+'+'+'+'.join(str(x))), range(1,5000)))))

2018/02/10 08:39

추천은 다 읽음

    class Program
    {
        private static int LIMIT = 5000;
        private static ArrayList notSelfNumberList;

        static void Main(string[] args)
        {
            initNotSelfNumberList();

            printTotalSelftNumberSum();

        }
        //not self-number list 셋팅
        public static void initNotSelfNumberList()
        {
            notSelfNumberList = new ArrayList();

            //5000보다 작으며 5000에 가장 근접한 self값을 모르며 제한되는 generator를 모르기 때문에 LIMIT까지 진행.
            for (int i = 0; i <= LIMIT; i++)
            {
                string strNum = string.Format("{0}", i);

                //자기 자신도 더해야 하므로 우선 자기 자신을 최초 숫자로 셋팅
                int notSelfNumber = i;
                //각 자리수를 전부 분해하여 더한다.
                for (int idx = 0; idx < strNum.Length; idx++)
                {
                    notSelfNumber += Int32.Parse(strNum.Substring(idx, 1));
                }

                //더한 숫자가 한도 범위를 벗어 난다면 for문 중단.
                if (notSelfNumber > LIMIT) break;

                //한도를 넘지 않았다면 not self-number list에 포함
                notSelfNumberList.Add(notSelfNumber);
            }
        }

        public static void printTotalSelftNumberSum()
        {
            int sum = 0;
            string selfNumber = string.Empty;

            //1부터 LIMIT까지 진행
            for (int i = 1; i <= LIMIT; i++)
            {
                //not self-number list에 포함되어 있다면 통과
                if (notSelfNumberList.Contains(i)) continue;

                //아니라면 최종합에 더하기.
                sum += i;
                selfNumber += i.ToString() + ",";
            }

            Console.WriteLine("self Numeber : " + selfNumber);
            System.String.Format("sum : {0}", sum);

            Console.WriteLine("self Number Sum : " + sum);
        }
    }
}

2018/02/11 16:13

정태식

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 5000

int arr[MAX];

int main(){
    int i=0;
    int num=1;
    int sum=0;
    for(i=0; i<MAX; i++){
        num=sum=i;  // 자기 자신을 더해주고
        while(num!=0){  // 몫이 0이 아니면
            sum+=num%10;    // 자릿수를 모두 더한다
            num/=10;    
        }
        arr[sum]=1; // 셀프넘버가 존재하는 인덱스 체크
    }
    // 셀프넘버의 합
    sum=0;
    for(i=0; i<MAX; i++)
        if(arr[i]==0) sum+=i;
    printf("%d",sum);
}

2018/02/12 18:59

gudrhrehd123

package generator;

public class Generator {

    public static void main(String[] args) {
        int[] ary = new int[5000];      //generator이 아닌 수 저장을 위한 배열 선언
        int n = 1;
        int sum = 0;
        for(n=1; n<5000;n++) {
            //1이상 5000미만 d(n)이 존재할 경우 해당 숫자 인덱스에 넣기
            if(generateNum(n) <5000 && generateNum(n)>=1) ary[generateNum(n)] = generateNum(n);
            else continue;
        }
        for(int i = 0; i<5000;i++) {
            if (ary[i] == 0) sum += i;  //generator이 존재하지않아 배열 안에서 0으로 표기된 숫자의 sum 구하기
            else continue;
        }

        System.out.println(sum);
    }
    //generator 판별 method
    public static int generateNum(int num) {

        int result = 0;
        String numString = "" + num;
        for(int i =0; i<numString.length();i++) {
            result +=Integer.parseInt(""+numString.charAt(i));
        }
        result += num;
        return result;
    }

}

Java로 구현해보았습니다!

답 : 1227365

2018/02/14 09:50

Jimin Kim

def selfnum():
    temp=[]
    notself=[]
    n=input('range:')
    for i in range(1,n+1):
        for j in (str(i)):
            temp.append(j)
        temp=[int(x) for x in temp]
        notself.append(sum(temp)+i)
        temp=[]
    notself=list(set(notself))
    self=range(1,n+1)
    for x in notself:
        if x<=n:
            self.remove(x)
    print self
    print sum(self)

answer=1227365

2018/02/14 16:49

Da ne

sum(set(range(1, 5000)) - {x + sum([int(i) for i in str(x)]) for x in range(1, 5000)})

set, map, 집합, 문자열, 조건리스트, sum 등등 많이 배웠습니다.

2018/02/15 17:06

yonggyu park

def Generator_test(n):
    for k in range(1,n):
        temp_sum=0
        for g in str(k):
            temp_sum+=int(g)
        if (temp_sum+k)==n:
            return True
            break
    return False

ans_sum=0
for b in range(1,5000):
    if Generator_test(b)==False:
        ans_sum+=b

print(ans_sum)





2018/02/17 06:48

D B

def generator(n):
    if type(n) is int:
        result = 0
        for char in str(n): result += int(char)
        return result + n
    return None

def inverse_generator(n):
    if type(n) is int:
        for temp in range(1, n):
            if generator(temp) == n: return 1
        return None

result = 0
for temp in range(1, 5000):
    if inverse_generator(temp) == None: result += temp

print(result)

파이썬 초보가 한 번 올려 봅니다. 많이 비효율적입니다

2018/02/18 17:23

YongJun Kim


import java.util.HashMap;
import java.util.Map;

public class Generator {

    public static void main(String[] args) {

        int result = 0; //selfnumber의 합 결과

        Map<Integer, Integer> list = new HashMap<>(); // key에 1~4999숫자, value에는 key의 각자리수+원래수 의 합

        list = generator(); // generator() 호출시 1부터 4999까지의 각자리수+원래수 값을 담는다.

        System.out.println(selectSelfNumber(list)); // map list 에 담겨있지 않은 selfNumber의 값 합을 리턴하여 값 출력

    }

    public static Map<Integer, Integer> generator(){

        Map<Integer, Integer> list = new HashMap<>();

        int j = 1;

        for(; j < 5000; j++){
            int sum = 0; //각자리수 + 원래값의 합
            int checkNum = j; // 1부터 4999까지 체크하기 위해 선언
            int digit = 0; // 각자리수

            sum = checkNum % 10;
            checkNum = checkNum / 10;

            while(checkNum > 0){ //원래값이 두자리 이상인경우
                digit = checkNum % 10;
                checkNum = checkNum / 10;
                sum += digit;
            }

            sum += j; // 원래값 합하기

            list.put(j, sum); // 키 : 원래값, value : 각자리수 + 원래값
        }

        return list;
    }

    public static int selectSelfNumber(Map<Integer, Integer> list){

        boolean value = false; // selfNumber인지 아닌지

        int sum = 0; //셀프넘버의 합

        for(int i=1; i< 5000; i++){

            value = list.containsValue(i); //1~4999까지 value값과 비교해서 있으면 true, 없으면 false(selfNumber)

            if(value != true){ //false인경우 합한다.
                sum += i;
            }
        }
        return sum;


    }


}

답은 1227365 입니다.

2018/02/23 01:04

김태훈

sum(i for i in range(5001))-sum(i for i in range(5001) if i in list(n+eval("+".join(str(n))) for n in range(max(i-40,1),i)))

2018/02/27 11:07

김자현

def dn(number):
    sum = 0
    for digit in str(number):
        sum += int(digit)
    return sum

answer_list = []

for i in range(1,5001):
    answer_list.append(i)

for n in range(1,5001):
    d = n + dn(n)
    if d in answer_list:
        answer_list[n + dn(n)-1] = 0

answer = sum(answer_list)
print(answer)

2018/02/27 23:02

윤민일

public class SelfNumber {

    public static void main(String[] args) {
        int[] array = new int[5001];

        for(int i = 1; i <=5000; i++) {
            String str = i + "";
            int searchNum = 0;
            for(int j = 0; j < str.length(); j++) {
                int num = Integer.parseInt(str.charAt(j) + "");
                searchNum += num;
            }
            searchNum += Integer.parseInt(str);
            if(searchNum <= 5000) {
                array[searchNum] = 1;
            }
        }

        int sum = 0;
        for(int i = 1; i <= 5000; i++) {
            if(array[i] != 1) {
                sum += i;
            }
        }
        System.out.println("Self Numbers의 합은: " + sum);
    }

}

2018/02/28 10:42

초초보

sum(set(range(1,5000))-set([sum([int(i) for i in str(x)])+x for x in range(1,5000)]))

2018/02/28 16:11

코끼리식당

public class Generator { public static void main(String[] args) { boolean[] numbers = new boolean[5000];

    Integer a,b,c,d;
    Integer gen,sum = 0;

    for(int generator=1; generator<5000; generator++) 
    {
        a=generator/1000;
        b=(generator/100)%10;
        c=(generator/10)%10;
        d=generator%10;

        gen = a+b+c+d+generator;
        if ((gen>=1) && (gen<5000)) {
            numbers[gen] = true;
        }
    }

    for(int i=1; i<5000; i++) {
        if(numbers[i]==false) {
            sum = sum + i;
        }
    }
    System.out.println("The sum of self-numbers are : " + sum);

}

2018/03/02 10:08

J

#include <iostream>

using namespace std;

int main(){
    int a[4998];
    int sub = 0;
    for (int k = 1; k < 5000; k++) {
        a[k - 1] = k;
}
    for (int i = 1; i< 5000; i++) {
        int n = i / 10 + i % 10 + i;
        for (int j = 0; j < 4999; j++) {
            if (n == a[j]) {
                a[j] = 0;
            }
            else{}
        }
    }

    for (int b = 0; b < 4999; b++) {
        if(a[b]==0){
        }
        else {
            sub = a[b] + sub;
        }
    }

    cout << sub;
}

한번 봐주세요ㅠㅠ

2018/03/05 15:11

노명준

```{.java}

public class Selfnumber {

public static void main(String[] args) {
    int sum = 0;
    int tmp;
    int[] arr = new int[5001];
    for (int i = 0; i < arr.length; i++) {
        arr[i] = 0;
    }

    for (int i = 1; i <= 5000; i++) {
        tmp = i/1000 + (i%1000)/100 + ((i%1000)%100)/10 + ((i%1000)%100)%10 + i;
        if(tmp <= 5000)
            arr[tmp] = 1;
    }

    for (int i = 1; i <= 5000; i++) {
        if(arr[i] == 0)
            sum +=i;
    }

    System.out.println("Anser is " + sum);
}

}

1) 5000캄의 배열 생성, 모두 0으로 채움 2) 1부터 5000까지의 숫자를 이용해서 만들어지는 수를, 합게값과 동일한 배열의 칸에 1로 입력. 3) 0으로 입력된 칸의 번호를 모두 합산

2018/03/06 17:50

강성민

"""
author: kenny
date: 03/08/2018
"""


def func():
    numbers = [x for x in range(1,5000,1)]
    generators = []
    self_numbers =[]
    for i in range(1,5000,1):
        dn = i
        # declare dn
        for j in range(len(str(i))):
            dn += int(str(i)[j])
        # append each cipher of i to dn
        if dn < 5000:
            generators.append(dn)
        # get generators
    list(set(generators))
    # delete duplicate generators

    for number in numbers:
        if number not in generators:
            self_numbers.append(number)
    # check self_number

    return sum(self_numbers)


if __name__ == "__main__":
    result = func()
    print(result)

2018/03/08 20:15

Kenny Jeon

def generator(a, b):
    gens = set([])
    set1 = set(range(a, b))
    for n in range(a, b):
        add = 0
        for args in str(n):
            add = add + int(args)
        gens.add(add + n)
    return sum(list(set1 - gens))

Python 3 세트 차집합을 이용했습니다.

2018/03/14 22:54

myyh2357

def d(n):
    return sum(map(int,list(str(n))))+n
s1=set()
s2=set(range(1,5000))
for i in range(1,5000):
    s1.add(d(i))
print(sum(s2-s1))


2018/03/18 04:01

python

swift4.0으로 풀었습니다.

import Foundation

func d_fn(n:Int) -> Int{
    let str_n = String(n)

    var generator = 0

    for i in str_n {
        let int_i = Int(String(i))!

        generator += int_i
    }

    return n + generator
}

var generators = [Int]()

for i in 1...5000 {
    let generator = d_fn(n: i)
    generators.append(generator)
}

let numbers = Set<Int>(1...5000)
let self_numbers = numbers.subtracting(generators)

print(self_numbers.reduce(0, +))

2018/03/19 15:48

박길남

have_gen = []
for n in range(1, 5001):
    result = n
    for i in range(len(str(n))-1, -1, -1):
        result += n//(10**i)
        n -= (n//(10**i))*(10**i)
    have_gen.append(result)

numbers = list(range(1, 5001))
for k in have_gen:
    if k in numbers:
        numbers.remove(k)
    else:
        continue

print(sum(numbers))

python 3.6

2018/03/20 17:04

최상혁

몇년간 손놓았던 파이썬 기초공부를 다시 시작 해볼까 합니다.ㅠㅠ

def generateNum(inputNumber):
    sumResult = 0
    for n in str(inputNumber):
        sumResult = sumResult + int(n)

    return sumResult + inputNumber


ORIGIN = set(range(1,5001))
FILTER = set([generateNum(n) for n in range(1, 5001)])

print(sum(ORIGIN - FILTER))

#OUTPUT: 1227365

2018/03/23 11:30

무명소졸

public class Self{
 public static void main(String[] args){
   int i,j,k;
   int Sum1 = 0;
   int []a = new int[10000];

   for(i=0;i<4999;i++){
    int n = 0;
    int input = (i+1);
    for(j=0;j<i+1;j++){
    int b = 0;
    b = input%10;
    n += b;
    input = (int)(input/10);
    }
    n += (i+1);
    a[n-1] = 1;
   }

  System.out.print("셀프 넘버들의 합은 ");
   for(k=0;k<4999;k++){
    if(a[k] == 0){
     Sum1 += (k+1);
    }
    else;
  }

  System.out.println(Sum1 + "입니다.");
 }
}


2018/03/23 21:12

배혜민

k=0
def generator(a):
    result = 0
    for i in range(1,a):
        b = i//1000
        c = (i - b*1000)//100
        d = (i - b*1000 - c* 100)//10
        e = (i - b*1000 - c*100 - d*10)
        if i+b+c+d+e == a:
            result = True
            break
        else :
            result = False
    return result
for i in range(1,5000):
    if not generator(i):
        k += i
print(k)

2018/03/26 16:01

최의현

def nexon(a,b) :
    mylist =[]
    for i in range(a,b):
        res = i + sum(int(j) for j in str(i))
        if res < b : mylist.append(res)
    return sum(range(a, b)) - sum(set(mylist))

print(nexon(1,5000))

2018/03/28 11:27

yijeong

def d(i) :
    sum1 = i
    for j in str(i):
        sum1 += int(j)
    return sum1

a1 = set(d(i) for i in range(5000))
a2 = set(range(5000))
print(sum(a2 - a1))

2018/03/28 14:44

재즐보프

sum_list = []
remove_list = []
sam = 0
sun = 0
sub = 0
for x in range(5000):
    sam = sam + x

for x in range(5000):
    sun = 0
    for a in str(x):
        sun = sun + int(a)
    sun = sun + x
    sum_list.append(sun)
sum_list = list(set(sum_list))
sum_list.sort()

for k in sum_list:
    if k > 4999:
        remove_list.append(k)
for q in remove_list:
    sum_list.remove(q)

for k in sum_list:
    sub = sub + k

print(sam - sub)

2018/03/30 19:01

최성범

def generator(n):
    y=n
    sum=0
    for i in range(4):
        sum=sum + n % 10
        n = n//10
    return sum+y

self=[generator(n) for n in range(5000)]
b=[n for n in range(5000) if n not in self]

print(generator(91))
print(sum(b))

2018/04/03 20:40

김현식

파이썬 다른분들에 비해 아직 부족하지만 열심히 공부하는 중입니다!

def d(num):
    num_str = str(num)
    num_list = list(map(lambda x: int(x), num_str))
    return sum(num_list) + num

gen = []
for i in range(1,5001):
    gen.append(d(i))

number = [i for i in range(1,5001)]

self_number = set(number) - set(gen)
print(sum(self_number))

2018/04/04 21:09

이진우

Pharo Smalltalk 6.1

solution
    | dn generatee sum |

    dn := [ :value |
        | tmp |
        tmp := value.
        (value asString) do: [ :char | tmp := tmp + (char digitValue) ].
        tmp
    ].

    generatee := Array new:(dn value:4999) withAll:false.
    1 to:4999 do: [ :generator | generatee at:(dn value:generator) put:true ].

    sum := 0. 1 to: 4999 do: [ :idx | (generatee at:idx) ifFalse: [ sum := sum + idx ] ].

    ^ sum

2018/04/05 17:15

mohenjo

import java.util.ArrayList;

public class SelfNumberProb {
    static ArrayList numList;

    public static int getNotSelfNum(int generator) {
        int output=generator;
        String i_String = new String(Integer.toString(generator));

        for(int i=0; i < i_String.length();i++){
            output += (int)i_String.charAt(i)-48;
        }
        return output;
    }

    public static void main(String[] args) {
        numList = new ArrayList();
        int sumSelfNum=0;

        for(int i=1; i<5000; i++){
            numList.add(Integer.toString( getNotSelfNum(i) ));
        }

        for(int i=1; i<5000; i++){
            if(!numList.contains(Integer.toString(i))){
                sumSelfNum+=i;
            }
        }
        System.out.println(sumSelfNum);
    }
}

2018/04/06 00:19

이호영

def notself(max):
    def g(n):
        return sum(int(x) for x in str(n))+int(n)

    a=[]
    for n in range(1,max):
        a.append(g(n))
    return sum(set(range(1,max))-set(a))

2018/04/07 14:46

thuruk

import java.util.ArrayList;

public class SelfNumberProb { static ArrayList numList;

public static int getNotSelfNum(int generator) {
    int output=generator;
    String i_String = new String(Integer.toString(generator));

    for(int i=0; i < i_String.length();i++){
        output += (int)i_String.charAt(i)-48;
    }
    return output;
}

public static void main(String[] args) {
    numList = new ArrayList();
    int sumSelfNum=0;

    for(int i=1; i<5000; i++){
        numList.add(Integer.toString( getNotSelfNum(i) ));
    }

    for(int i=1; i<5000; i++){
        if(!numList.contains(Integer.toString(i))){
            sumSelfNum+=i;
        }
    }
    System.out.println(sumSelfNum);
}

}

2018/04/09 19:00

聂金鹏

#include <iostream>

using namespace std;

int main()
{
    int n=1;  // 자기자신을 표현
    int num1, num2,num3,num4; // 1의자리, 10의자리 100의자리, 1000의자리
    int d_n = 0, sum1to5000 = 0; // d(n)과 1에서 5000까지의 합을 미리 선언합니다.

    bool* checklist = new bool[5000]; // d(n)의 중복확인을 위한 용도입니다.
    for (int i = 0; i < 5000; i++) {
        sum1to5000 += i; // 합을 미리 구하고 d(n)을 제외하며 할 계획입니다.
        checklist[i] = 0; // 현재 d(n)의 값이 들어간 적이 없으니 모든 요소를 false로 선언합니다.
    }

    while (d_n < 5000) {

        num1 = n % 10;
        num2 = (int)((n % 100)*0.1);
        num3 = (int)((n % 1000)*0.01);
        num4 = (int)(n * 0.001);
                // 각자리수의 숫자 받기
        d_n = num1 + num2 + num3 + num4 + n;
                //generator 계산
        if (checklist[d_n] == false) sum1to5000 -= d_n; //만약 기존에 나온 값이 아니라면 sum에서 빼줍니다.
        checklist[d_n] = true;// 값이 들어갔음을 표시합니다.
        n++;
    }

    cout << sum1to5000;

    system("pause");

    return 0;
}

기존에 합에서 generator에서 d(n)으로 나온값들을 중복없이 제외하면서 값을 구했습니다.

2018/04/10 22:42

Jin-seok Lee

// javascript 풀이입니다.
const getSumOfSelfNumbers = (limitNum) => {
    const getTodal = (num) => {
        const strNum = num.toString().split('');
        const getSum = (tally, curr) => tally + parseInt(curr, 10);
        const total = strNum.reduce(getSum, num);
        return total;
    };
    const range = Array.from(new Array(limitNum), (v, i) => i + 1);
    const notSelfNumberSet = new Set(range.map(i => getTodal(i)));
    const getSum = (tally, curr) => notSelfNumberSet.has(curr) ? tally : tally + curr;
    const sumOfSelfNumbers = range.reduce(getSum, 0);
    return sumOfSelfNumbers
}

getSumOfSelfNumbers(5000)

2018/04/12 00:28

정지원

#python3
sum(set(range(1,5000)) - {i + sum([int(j) for j in str(i)]) for i in range(5000)})

답: 1227365

2018/04/13 02:07

김태영

public class SelfNumber {

    public static void main(String[] args) {
        // 1~5000 까지
        // generator 로 돌려서 각 값을 배열에 저장
        // 그중 1~5000과 일치하지 않는 수를 골라낸다
        // int 를 나눌 경우 소수점 이하는 계산에서 무시되므로 int를 사용

        Integer a,b,c,d,result,sum=0;

        boolean[] generated = new boolean[5000];

        for(int generator=1; generator<5000;generator++){
            a = generator/1000;
            b = (generator/100)%10;
            c = (generator/10)%10;
            d = generator%10;

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

            if((result>=1)&&(result<5000)){
                generated[result] = true;
            }
        }

        for(int i=1; i<5000; i++){
            if(generated[i]==false){
                sum = sum + i;
            }
        }

        System.out.println("Self-Number의 합계는 : " + sum);

    }
}

2018/04/16 17:30

배혁남

# -*- coding: utf-8 -*-

total_sum = sum(xrange(1, 5000))  # 자연수 1부터 4999까지의 총합
bitmap = 0  # 뺸 숫자를 표시하기 위한 비트맵

for n in xrange(1, 5000):
    dn = n + sum(int(digit) for digit in str(n))
    # d(n)이 5000보다 작은 숫자가 아니라면, 다음 자연수 n으로 넘어간다.
    if not dn < 5000:
        continue

    # d(n)이 총합에서 이미 뺐었던 숫자인지 확인한다.
    already_subtracted = bitmap & (1 << dn)
    # 아직 빼지 않은 숫자라면,
    # 총합에서 d(n)을 빼고 비트맵에서 d(n)에 해당하는 비트를 플립한다.
    if not already_subtracted:
        total_sum = total_sum - dn
        bitmap = bitmap | (1 << dn)

print total_sum

2018/04/20 17:44

마치헤어


from functools import reduce

def generators(n):
    sum = 0
    for i in str(n):
        sum += int(i) 
    sum += n
    return sum

list_generator = set(map(generators, range(1,5000)))
self_num_list = [i for i in range(1,5000) if i not in list_generator]
reduce((lambda x,y: x+y), self_num_list)

2018/04/21 23:59

Mark

셀프넘버의 합 = 전체숫자의 합 - non셀프넘버의 합으로 구했습니다

import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * 셀프넘버의 합 = 전체숫자의 합 - non셀프넘버의 합
 * @author 
 * @see http://codingdojang.com/scode/365
 *
 */
public class Problem365 {

    static final int MAX = 5000;

    public static void main(String[] args) {
        // non셀프넘버의 합
        int sumOfNonSelfNumber = IntStream.rangeClosed(1, MAX)
                .map(n -> generate(n))
                .filter(e -> e <= MAX)
                .distinct()
                .sum();

        // 전체숫자의 합 - non셀프넘버의 합
        int sumOfSelfNumber =  IntStream.rangeClosed(1, MAX).sum() - sumOfNonSelfNumber;

        System.out.println(sumOfSelfNumber);
        // OUTPUT = 1227365
    }

    private static int generate(int n) {
        return n + Stream.of(String.valueOf(n).split("")).mapToInt(Integer::parseInt).sum();
    }

}

2018/04/25 17:29

Seongsu Kim

a = set([sum([int(y) for y in str(x)]) + x for x in range(1, 5000)])
b = set(range(1, 5000))
sum(b - a)

2018/04/25 20:17

Jaypy Hwang

c# 으로 옮기며 배우는 중입니다.

        public static int SumOfSelfNumbers1(int n)
        {
            var sum = 0;
            var outputs = new Hashtable();
            for (int i = 1; i < n; i++)
            {
                var d = i / 1000 + (i % 1000) / 100 + (i % 100) / 10 + i % 10 + i;
                outputs[d] = i;
            }
            for (int i = 1; i <= n; i++) sum += outputs.ContainsKey(i) ? 0 : i;
            return sum;
        }

2018/04/26 16:28

비트에이스

// C language version
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int generatedNumbers[5000] = {0,};
    int arrIndex = 0;
    int generator;

    for (generator = 0; generator < 5000; generator++)
    {
        int sumOfSingleDigit = 0;
        int i = generator;
        while (i > 0)
        {
            sumOfSingleDigit += (i % 10);
            i = (i / 10);
        }
        generatedNumbers[arrIndex++] = generator + sumOfSingleDigit;
    }
    printf("\n\n");

    int selfNumber;
    int sumOfSelfNumber = 0;
    for (selfNumber = 0; selfNumber < 5000; selfNumber++)
    {
        int isSelfNumber = 1;
        int j;
        for (j = 0; j < arrIndex; j++)
        {
            if (selfNumber == generatedNumbers[j])
            {
                isSelfNumber = 0;
                break;
            }
        }
        if (isSelfNumber)
        {
            sumOfSelfNumber += selfNumber;
            printf("[%d]", selfNumber);
        }
    }

    printf("\n\n%d\n", sumOfSelfNumber);

    return 0;
}

2018/04/29 00:10

Wilde Oscar

// c++ version
#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

class Generator
{
public:
    Generator();
    Generator(Generator& gen);
    Generator& operator++();
    Generator operator++(int);
    Generator& operator+(unsigned int n);
    unsigned int GetNumericNumber();
    unsigned int Generate();
    unsigned int getThousand()
    {
        return thousand;
    }
    unsigned int getHundred()
    {
        return hundred;
    }
    unsigned int getTen()
    {
        return ten;
    }
    unsigned int getOne()
    {
        return one;
    }

private:
    void increase(unsigned int n = 1);
    bool isSingleDigit(unsigned int digit);
    void increaseImpl(unsigned int& prior, unsigned int& latter);

    unsigned int thousand;
    unsigned int hundred;
    unsigned int ten;
    unsigned int one;
};

int main()
{
    Generator generater;
    vector<unsigned int> generatedNum;

    while (generater.GetNumericNumber() < 5000)
    {
        generatedNum.push_back(generater.Generate());
        ++generater;
    }

    unsigned int sumOfSelfNum = 0;
    for (unsigned int selfNum = 0; selfNum < 5000; selfNum++)
    {
        bool isSelfNum = true;
        for (auto iter = generatedNum.cbegin();
                iter != generatedNum.cend(); iter++)
        {
            if ((*iter) == selfNum)
            {
                isSelfNum = false;
                break;
            }
        }
        if (isSelfNum)
        {
            sumOfSelfNum += selfNum;
        }
    }

    cout << "sum of self number : " << sumOfSelfNum << endl;

    return 0;
}

Generator::Generator() : thousand(0), hundred(0), ten(0), one(0) {}
Generator::Generator(Generator& gen) : thousand(gen.getThousand()), hundred(gen.getHundred()), ten(gen.getTen()), one(gen.getOne()) {}

Generator& Generator::operator++()
{
    increase();
    return *this;
}

Generator Generator::operator++(int)
{
    Generator result(*this);
    result.increase();
    return result;
}

Generator& Generator::operator+(unsigned int n)
{
    increase(n);
    return *this;
}

unsigned int Generator::GetNumericNumber()
{
    return (1000 * thousand) + (100 * hundred) + (10 * ten) + one;
}

unsigned int Generator::Generate()
{
    return GetNumericNumber() + thousand + hundred + ten + one;
}

void Generator::increase(unsigned int n)
{
    one += n;
    increaseImpl(ten, one);
    increaseImpl(hundred, ten);
    increaseImpl(thousand, hundred);
    unsigned int junk = 0;
    increaseImpl(junk, thousand);
    if (junk != 0)
    {
        cout << "out of bound" << endl;
    }
}

bool Generator::isSingleDigit(unsigned int digit)
{
    return digit < 10;
}

void Generator::increaseImpl(unsigned int& prior, unsigned int& latter)
{
    if (!isSingleDigit(latter))
    {
        latter %= 10;
        prior++;
    }
}

2018/04/29 18:18

Wilde Oscar

// java version
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class SelfNumber {
  private static int MAXIMUM_SIZE = 5000;

  private SelfNumber() {}

  private List<Integer> generateNumbers() {
    List<Integer> list = new ArrayList<>();

    int i = 0;
    while (i++ < MAXIMUM_SIZE) {
      list.add(generateNumber(i));
    }

    return list;
  }

  private int generateNumber(int i) {
    int sum = i;
    while (i > 0) {
      sum += (i % 10);
      i = i / 10;
    }
    return sum;
  }

  private int getSelfNumberSum() {
    int i = 0, sum = 0;
    while (i++ < MAXIMUM_SIZE) {
      sum +=
          (Arrays.binarySearch(generateNumbers().stream().sorted().distinct().toArray(), i) >= 0
              ? 0
              : i);
    }

    return sum;
  }

  public static void main(String[] args) {
    SelfNumber selfNumber = new SelfNumber();
    System.out.println("sum of self numbers : " + selfNumber.getSelfNumberSum());
  }
}

2018/04/29 19:12

Wilde Oscar

// java another version

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SelfNumber {
  private static int MAXIMUM_SIZE = 5000;

  private static List<Integer> generateNumbers() {
    return IntStream.range(0, MAXIMUM_SIZE)
        .map(
            i -> {
              int sum = i;
              while (i > 0) {
                sum += (i % 10);
                i = i / 10;
              }
              return sum;
            })
        .boxed()
        .collect(Collectors.toList());
  }

  public static void main(String[] args) {
    List<Integer> generated = generateNumbers();
    System.out.println(
        "sum of self numbers : "
            + IntStream.range(0, MAXIMUM_SIZE).filter(i -> !generated.contains(i)).sum());

// or

List<Integer> list = IntStream.range(0, MAXIMUM_SIZE)
    .boxed().collect(Collectors.toList());
list.removeAll(generated);
System.out.println( "sum of self numbers : " + 
   list.stream()
   .mapToInt(Integer::intValue).sum());
}

2018/05/01 17:42

Wilde Oscar

// go version

package main

func generate(list []int) []int {
    newlist := make([]int, 5000)
    for i, v := range list {
        sum := v
        for v > 0 {
            sum += v % 10
            v /= 10
        }
        newlist[i] = sum
    }
    return newlist
}

func dropIfContainsAndSummerize(src []int, container []int) int {
    result := 0
    for _, v := range src {
        b := true
        for _, v2 := range container {
            if v == v2 {
                b = false
            }
        }
        if b {
            result += v
        }
    }

    return result
}

func main() {
    list := make([]int, 5000)

    for i := range list {
        list[i] = i
    }

    generated := generate(list)
    sum := dropIfContainsAndSummerize(list, generated)

    println("sum : ", sum)
}

2018/05/01 21:09

Wilde Oscar

public class practice {

static int getDn(int n) {
    int dn = n;
    while(n > 0) {
        dn += n % 10; 
        n /= 10;    
    }
    return dn;
}

public static void main(String[] args) {

    boolean[] isNotSelfNum = new boolean[5001];

    for (int i=1; i<5000; i++) {
         int dn = getDn(i); // 1 부터 10000의 dn을 구한다
        if (dn <= 5000) {
            isNotSelfNum[dn] = true;  // dn은 셀프넘이 아니니까 true           
        }
    }

    int sum = 0;

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

}{.java} 자바입니다

2018/05/03 09:48

정몽준

#include <stdio.h>

int main(void)
{
    int self = 0;
    int cnt;
    int i,j = 0;
    for(i=1;i<5000;i++){
        cnt = 0;
        for(j=1;j<5000;j++){
            if(i == j-1)
                break;
            else if(i == j + (j/1000) + (((j%1000))/100) + ((((j%1000))%100)/10) + ((((j%1000))%100)%10)){
               cnt++;
            }
        }
        if(cnt == 0){
            self = self + i;
        }
    }

    printf("self : %d\n", self);
    return 0;
}

무지막지하게 수작업으로 했습니다. 이중포문 이용하여서 i를 d(n)이라 하고 j를 제너레이터라고 생각하고 d(n)에 대해서 1 ~ (d(n)-1)를 제너레이터 후보로 고려하고 각각의 자릿수를 쪼개가며 검사했습니다. 만일 검출된다면 카운트를 증감시켰고 만일 카운트가 증가되지않았다면 셀프다라고 생각하여 셀프를 구했습니다.

2018/05/03 18:21

김엽기

// c++ another version

#include <iostream>
#include <forward_list>
#include <numeric>
#include <algorithm>

using namespace std;

int  GetSelfNumberSum(int start, int end)
{
    forward_list<int> sequentialNumber(end - start);
    forward_list<int> generatedNumber;
    iota(sequentialNumber.begin(), sequentialNumber.end(), start); // initialize list 1 ... 4999

    generatedNumber.resize(end - start);
    std::transform(sequentialNumber.begin(), sequentialNumber.end(), generatedNumber.begin(), [](int n) -> int { 
        int generated = n;
        while (n > 0)
        {
            generated += (n % 10);
            n /= 10;
        }
        return generated;
    });

        // another way
    /*for_each(sequentialNumber.begin(), sequentialNumber.end(), [&generatedNumber](int num) {
        // push generated number to the list;
        generatedNumber.push_front([](int n) -> int {
            int generated = n;
            while (n > 0)
            {
                generated += (n % 10);
                n /= 10;
            }
            return generated;

        }(num));
    });*/

    // remove generated number from the 1...4999 which means self number
    for (int n : generatedNumber)
    {
        sequentialNumber.remove(n);
    }

    // sum of self numbers
    return std::accumulate(sequentialNumber.begin(), sequentialNumber.end(), 0);
}

int main()
{
    cout << "sum of self numbers: " << GetSelfNumberSum(1, 5000) << endl;

    return 0;
}

2018/05/05 22:21

Wilde Oscar

def gen(n):
       num = 1
       for a in range(1,n):
              for b in range(1,a):
                     x = list(str(b))
                     c = b
                     for ex in x:
                            c += int(ex)
                     if c == a:
                            break
                     else:
                            if b == a-1:
                                   num += a
       print(num)

def generator(n):
     a = []
     for x in range(1,n+1):
               a.append(sum(list(map(lambda x : int(x), list(str(x))))) + x)
     for x in range(1,n+1):
          if x not in a:
               a.append(x)
     print(sum(a[n:]))

2018/05/07 19:17

김영성

def d(n):

    temp = n        #본 숫자
    a = n//1000     #1000의 자리
    n -= a*1000

    b = n//100      #100의 자리
    n -= b*100

    c = n//10       #10의 자리
    n -= c*10       #1의 자리

    gen = a+b+c+n+temp

    return gen

Generator_list = [d(n) for n in range(5000)]
Self_num_list = [n for n in range(5000) if n not in Generator_list]


print(sum(Self_num_list))

2018/05/08 17:44

송준호

class Self_number:
 def __init__(self,B,T):
  self.T = T
  self.B = B
 def Self_sum(self):
  Normal  = set(range(self.B,self.T))
  Nonself = set([x+sum([int(y) for y in str(x)]) for x in range(self.B,self.T)])
  self.Answer = sum(Normal - Nonself)

O = Self_number(1,5000)
O.Self_sum()
print(O.Answer)

2018/05/11 13:29

shato

def count(num) :
    s = str(num) # int -> str
    tmp = num  # tmp = 제네레이터 값
    for k in s :
        tmp += int(k)
    return tmp

result = range(1,5000)
result = list(result)

for i in range(5000) : # 1~ 5000까지 제네레이터 값 제거
    genera = count(i)
    if result.__contains__(genera) :
        result.remove(genera)

sum = 0
print(result)

for i in result :
    sum += i

print(sum)

2018/05/11 13:59

sc K

bool bGenerator[5000] = {false}; int iResult = 0; for(int i = 1; i < 5000; ++i) { int a = i%1; int b = i%10; int c = i%100; int d = i%1000; int sum = a+b+c+d +i; bGenerator[sum] = true; } for(int i = 0; i < 5000; ++i) { if(bGenerator[i] == false) iResult += i; }

2018/05/16 13:52

이종경

#include<iostream>
#include"stdafx.h"

int O_Cal(int n)
{
    int result = n;
    int digit;
    for (int i = 3; i >= 0; i--)
    {
        digit = n/pow(10, i);
        result += digit;
        n = n - (digit*pow(10, i));
    }
    return result;
}
int main()
{
    int result=0;
    int Not_Self_Result=0;
    for (int i = 1; i < 5000; i++)
    {
        result += i;
        Not_Self_Result += O_Cal(i);
    }
    cout << result - (result - Not_Self_Result) << endl;
}

2018/05/17 20:21

Hujinsu

#include<iostream>
#include<string>
using namespace std;

int main() {
    bool Generator[50] = { false }; int result = 0;
    int n = 0;
    for (int i = 0; i < 50; i++) {
        n = i;  int sum = n;
        // n대신 i 를 썼을 때 무한 루프로 인한 오류로 인해 n을 도입할 수 밖에 없었음
        //i를 쓰면 i=0,1 사이에서 무한 루프가 돼버림
        while (n > 0) { 
            sum += n % 10;
            n = n/ 10;
        }       
        if (sum < 50)
            Generator[sum] = true;
    }
    cout << endl;

    for (int i = 0; i < 50; i++) {
        if (Generator[i] == false) {
            cout << i << endl;
            result += i;
        }
    }
    cout << "sum = " << result << endl;
}

2018/05/18 19:59

Gh S

public class SelfNumber {

    public static void main(String[] args) {
        // 1~5000 까지
        // generator 로 돌려서 각 값을 배열에 저장
        // 그중 1~5000과 일치하지 않는 수를 골라낸다
        // int 를 나눌 경우 소수점 이하는 계산에서 무시되므로 int를 사용

        Integer a,b,c,d,result,sum=0;

        boolean[] generated = new boolean[5000];

        for(int generator=1; generator<5000;generator++){
            a = generator/1000;
            b = (generator/100)%10;
            c = (generator/10)%10;
            d = generator%10;

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

            if((result>=1)&&(result<5000)){
                generated[result] = true;
            }
        }

        for(int i=1; i<5000; i++){
            if(generated[i]==false){
                sum = sum + i;
            }
        }

        System.out.println("Self-Number의 합계는 : " + sum);

    }
}

2018/05/21 13:47

我是谁(是不是很神奇?)


public class Generator {
    public static void main(String[] args) {
        int Answer[] = new int[5001];
        for (int i = 1; i < Answer.length; i++) {
            if (d(i) < Answer.length)
                Answer[d(i)] = 1;
        }
        int sum = 0;
        for (int i = 1; i < Answer.length; i++) {
            if (Answer[i] != 1)
                sum += i;
        }
        System.out.println(sum);
    }

    private static int d(int num) {
        int sum = num;
        while (num != 0) {
            sum += num % 10;
            num /= 10;
        }
        return sum;
    }
}

2018/05/21 21:20

김지훈

var d = function (n) {
    var splitN = n.toString().split("");
    var result = 0;
    for (var i = 0; i < splitN.length; i++) {
        result = parseInt(splitN[i]) + result;
    }
    return result + n;
};

var solution = function (max) {
    var arr = [];
    var sumN = 0;
    for (var i = 1; i <= max; i++) {
        if (d(i) > max) {
            continue;
        };
        arr[d(i)] = 1;
    }
    for (var i = 1; i <= max; i++) {
        if (!arr[i]) {
            sumN += i;
        }
    }
    return sumN;
}
console.log(solution(5000));

처음에는 for문 반복으로 했었는데 속도가 너무 느려서 key-value형식으로 저장한 다음 없는 값을 전부 더했습니다. 훨씬 빠르네요~

2018/05/22 00:42

고독한개발자

def d(n):
    while n <= 5000:
    #5000까지 숫자 입력

        a = len(str(n))
        #len함수로 바뀌는 자릿수 세기

        if a == 4:
            print(int(str(n)[a-1]) + int(str(n)[a-2]) + int(str(n)[a-3]) + int(str(n)[a-4]) + n)
        elif a == 3:
            print(int(str(n)[a-1]) + int(str(n)[a-2]) + int(str(n)[a-3]) +  n)
        elif a == 2:
            print(int(str(n)[a-1]) + int(str(n)[a-2]) +  n)
        else:
            print(int(str(n)[a-1]) +  n)
        #조건문으로 일일이 조건 잡아주기

        n += 1
        #입력한 수 +1
d(0)

쉬운 문제일텐데 워낙 초보라 한참을 헤맸네요

일단 다른 분들의 코드를 보지않고 혼자 코딩을 해봤다는 거에 의의를 두며, 해결하니까 너무 뿌듯하네요 ㅎㅎ

이제 다른 분들이 작성한 코드들을 보면서 공부해봐야겠네요

파이썬으로 작성했습니다

2018/05/23 23:02

정종훈

class CodeRunner{
    public static int aa(int a){
        int result=0;
        String num = String.valueOf(a);
        String [] temp  = num.split("");
        for(int i=0;i<temp.length;i++){
            result+=Integer.parseInt(temp[i]);
        }
        return result;
    }
      public static void main(String[] args){
        int max=5000;
        boolean []  arr = new boolean [max];
        int temp = 0;
        int result=0;
        for(int i=1;i<max;i++){
            temp = aa(i);
            if(temp<max){
                arr[temp] = true;
            }
        }

        for(int i=1;i<max;i++){
            if(arr[i]!=true){
                result+=i;
            }
        }

         System.out.println(result);
}

2018/05/25 15:25

유정현

def generator(number):
    total = number
    sen = str(number)
    for i in sen:
        total += int(i)
    return total

arr = set()
originArr = set()

for i in range(1,5001):
    arr.add(generator(i))

for i in range(1,5001):
    originArr.add(i)

res = list(originArr-arr)

total = 0
for i in range(len(res)):
    total += res[i]

print(total)

2018/05/28 16:51

bnewkk

#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
#include <memory.h>
#include <map>
#include <cmath>
#include <functional>
#include <vector>

using namespace std;

#define intmax 2147483647
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define REP(i, n) FOR(i, 0, n)
#define mp make_pair
#define SIZE 10000

int ans;
bool isgenerator[SIZE];

void TakeInput()
{

}

int getGeneratorValue(int i)
{
    int result = i;

    int value = i;
    int standard = 1;
    while (i >= standard)
        standard *= 10;

    standard /= 10;

    while (standard >= 1)
    {
        int quotient = value / standard;
        result += quotient;

        value -= quotient * standard;

        standard /= 10;
    }

    return result;
}

void Solve()
{
    FOR(i, 1, 5000)
        isgenerator[getGeneratorValue(i)] = true;

    FOR(i, 1, 5000)
        ans += isgenerator[i] ? 0 : i;
}

void Print()
{
    cout << ans;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    TakeInput();
    Solve();
    Print();

    return 0;
}

2018/05/28 21:34

CHAN HAENG Lee


function GetGeneratorNumber(generator)
{
    let strArray = String(generator).split('');

    let answer = strArray.reduce((pre,cur,curi)=>{
        return parseInt(pre) + parseInt(cur);
    },generator);    

    return answer;
}

let mapArray = new Map();

for(let i = 1 ;i < 5000 ; i++)
{
    let answer = GetGeneratorNumber(i);
    if(answer<5000 && (mapArray.get(answer) == undefined))
    {
        mapArray.set(answer,i);
    }
}

let selfNumberSum = 0;
for(let i = 1; i < 5000; i++ )
{
    if(mapArray.get(i) == undefined)
    {
        selfNumberSum+=i;
    }
}

console.log('selfNumberSum : '+selfNumberSum);

2018/05/28 23:58

elle0715

#include<iostream>
bool selfNum[5001] = { 0, };

int main(void) {
    using namespace std;
    ios::sync_with_stdio(false);

    int sum = 0,temp = 0;
    for (int i = 1; i <= 5000; i++) {
        temp = i;
        while (temp)
        {
            sum += temp%10;
            temp /= 10;
        }
        if(sum <=5000)
            selfNum[sum] = 1;
    }

    sum = 0;
    for (int i = 1; i <= 5000; i++) {
        if (selfNum[i]) {
            sum += i;
        }
    }
    cout << sum;
}

2018/05/29 20:26

최보규

pre_generator = []
all_number = [x for x in range(1,5000)]
def find_self_number():
    for i in range(1,5000):
        sum=0
        for j in str(i):
            sum += int(j)
        sum += i
        pre_generator.append(sum)
    generator=pre_generator.sort()
    self_number = [x for x in all_number if x not in pre_generator]
    result=0
    for i in self_number:
        result += i
    print(result)

find_self_number()

2018/05/31 00:40

조성은

Python 3.6.4

def splitsum(n):
    n_str = str(n)
    s = 0
    for i in n_str:
        s += int(i)
    s += n
    return s

def find_generator(n):
    gen_list = []
    for i in range(n):
    if splitsum(i) == n:
        gen_list.append(n)
    else:
        continue
    return list(set(gen_list))

------------------------------------
num_list = []
for i in range(1, 5000):
    num_list += find_generator(i)

------------------------------------
5000까지의 전체 합에서 제네레이터를 가지는 숫자의 합만 뺌
sum([i for i in range(1,5000)]) - sum((num_list))

답 : 1227365

2018/05/31 18:20

Gerrad kim

Python

n = 5000
ans = [0]*(n+1)
for i in range(1, n+1):
    #generator
    k = i + sum([int(j) for j in str(i)])
    if k <= 5000:
        ans[k] += 1
print(sum([i for i in range(1, n+1) if ans[i] == 0]))


2018/06/01 13:51

Taesoo Kim

int add = 0; int count = 5000; int sieve[5000] = { 0, }; int temp = 0;

for (int i = 1; i < count; i++) {
    temp = (i % 10) + ((i % 100) / 10) + ((i % 1000) / 100) + ((i / 10000)) + i;
    if (temp < 5000) {
        sieve[temp] = 1;
    }
}

for (int i = 1; i < count; i++) {
    if (!sieve[i]) {
        add += i;
    }
}

printf("%d\n", add);

2018/06/08 06:30

WonJong Bae

#include<iostream>
using namespace std;

int solution(int num)
{
    int remain = 0, devide = num, sum = 0;
    while (devide != 0)
    {

        remain = devide % 10;
        devide /= 10;
        sum += remain;
    }
    return sum+num;
}
bool checkGenerator(int input)
{
    for (int i = 1; i <= input - 1; i++)
    {
        if (solution(i) == input)
            return true;
    }
    return false;
}

int main()
{
    int result = 0;

    for (int i = 1; i <= 5000; i++)
    {
        if (checkGenerator(i) == false)
            result += i;
    }
    cout << result << endl;
}

2018/06/19 15:56

Jun ki Kim

import java.util.ArrayList;

public class SelfNumber2 {
    int max;
    ArrayList<Integer> nonSelfNum = new ArrayList<Integer>();
    ArrayList<Integer> SelfNum = new ArrayList<Integer>();

    public SelfNumber2(int max) {
        this.max = max;
    }


    public ArrayList<Integer> getNonSelfNum(){

        for (int num=1 ; num < this.max ; num++) {

            ArrayList<Character> partStr = new ArrayList<Character>();
            int partSum = 0;

            String strInt =  String.valueOf(num);// 정수 -> 문자열
            char[] parts = strInt.toCharArray();// 문자로 표현된 정수의 각 자릿수

            // char[](각 자릿수) -> ArrayList<Character> 저장
            for (char part : parts) { 
                partStr.add(part); 
                }

            // parStr 에 있는 값들을 integer로 변환하여 합을 구한다 / 각 자릿수의 합
            for (char partNum : partStr) { 
                partSum += Integer.parseInt(Character.toString(partNum)); 
                }// char -> string -> integer 변환 후 합계
            partSum = partSum + num; // 자기 자신의 값을 더해준다.

            this.nonSelfNum.add(partSum);
        }
        return this.nonSelfNum;
    }


    public ArrayList<Integer> getSelfNum(ArrayList<Integer> nonselfList){

        for (int each = 1; each < this.max ; each++ ) {
            if (this.nonSelfNum.contains(each)) { // 해당 숫자가 nonself number 인 경우 pass
                }
            else { this.SelfNum.add(each);
                }
        }
        return this.SelfNum;
    }


    public static void main(String[] args) {

        int maxNum = 5000; 
        SelfNumber2 sn2 = new SelfNumber2(maxNum);
        ArrayList<Integer> no_self = sn2.getNonSelfNum();
        ArrayList<Integer> selfNumList = sn2.getSelfNum(no_self);

        int selfNumSum = 0;
        for (int selfnum : selfNumList) {
            selfNumSum += selfnum;
        }
        // 출력
        System.out.printf("%d 보다 작은 모든 Self-Number 는 \r\n%s \r\n입니다", maxNum, selfNumList);
        System.out.println("\r\n");
        System.out.printf("%d 보다 작은 Self-Number 의 총합은 \r\n%d 입니다.",maxNum, selfNumSum );

    }

}

2018/06/20 16:08

이호재


temp = set()
target = set(range(1, 5001, 1))
for number in xrange(1, 5001, 1):
    result = number + sum([int(x) for x in str(number)])
    temp.add(result)

print sum(target - temp)

2018/06/22 09:36

남상본

파이썬으로 작성했습니다.

print(sum({ n for n in range(1,5000) }-{ sum(int(m) for m in str(n))+n for n in range(1,5000) }))

2018/06/22 17:11

박종범


def setNumberbyGen(maxNum):

    retNumSet = []

    for i in range(1, maxNum) :

        retNumSet.append(sum(int(s) for s in str(i)) + i)          

    return retNumSet;

numSet = setNumberbyGen(5000)

selfNum = set(range(1,5000)) - set(numSet)

print("Sum : ", sum(s for s in selfNum))  

2018/06/23 14:51

yoonjaepa

def generate(a_number): sum = 0 s_number = str(a_number) for i in range(len(s_number)): sum = sum+ int(s_number[i]) sum = a_number + sum return(sum) g_num = [] base = [] for i in range(1,20): gnum.append(generate(i)) snum = set(gnum)
for j in range(1,11): base.append(j) set_base = set(base) s_out = set_base - snum result = 0 for i in s_out: result = result + i print (result)

2018/06/23 15:23

Jay Lee


def generator(n):
    str_ori = str(n)
    each = 0

    for i in range(len(str_ori)):
        each += int(str_ori[i])

    return n + each


def main():
    list_answer = list()
    answer = 0
    for i in range(1,5001):
        list_answer.append(i)

    for i in range(1,5001):
        try:
            list_answer.remove(generator(i))
        except Exception as e:
            continue

    for i in range(len(list_answer)):
        answer += list_answer[i]    
    print(answer)


if __name__ == "__main__":
    main()

2018/06/25 23:05

이건수

import java.text.*;
import java.util.*;


public class Main {
    public static void main(String[] args) {
        int total_sum=0, gen_sum=0;
        List<Integer>nums=new ArrayList<Integer>();

        for(int i=0;i<5000;i++) {
            int chek=0;
            total_sum+=i;

            String str=String.valueOf(i);
            String[] strs=str.split("(?!^)");

            for(int k=0;k<strs.length;k++) {
                chek+=Integer.parseInt(strs[k]);
            }
            chek+=Integer.parseInt(str);
            if(!nums.contains(chek)) {
                nums.add(chek);
                gen_sum+=chek;
            }else {
                continue;
            }
        }
        System.out.println(total_sum-gen_sum);
    }
}

2018/06/26 10:30

에에엑

using System;

namespace CD001
{
    class Program
    {
        static void Main(string[] args)
        {
            int upperLimit = 5000;
            var dn = new Dn(upperLimit);
            Console.WriteLine(dn.SumSelfNumber); // 1227365
        }
    }

    class Dn
    {
        private int UpperLimit { get; }

        private bool[] DnList { get; }

        private int FuncDn(int aNumber)
        {
            int result = aNumber;
            foreach (var val in aNumber.ToString()) { result += (int)Char.GetNumericValue(val); }
            return result;
        }

        public Dn(int upperLimit)
        {
            UpperLimit = upperLimit;
            DnList = new bool[UpperLimit];

            for (int n = 1; n < UpperLimit; n++)
            {
                int tmpInt = FuncDn(n);
                if (tmpInt < UpperLimit) DnList[tmpInt] = true;
            }
        }

        public int SumSelfNumber
        {
            get
            {
                int sum = 0;
                for (int idx = 1; idx < UpperLimit; idx++)
                {
                    if (!DnList[idx]) sum += idx;
                }
                return sum;
            }
        }
    }
}

2018/06/26 21:06

mohenjo

pool = list(range(1, 5000))
def d(n):
    list1 = list(str(n))
    sum = 0
    for i in list1:
        sum += int(i)
    return n + sum


for i in range(1, 5000):
    try:
        pool.remove(d(i))
    except ValueError:
        pass

result = 0
for i in pool:
    result += i
print(result)

2018/07/03 01:32

WJ K

파이썬 Python

def calculate_generator(number):
    sum = number
    number_list = list(str(number))
    for i in number_list:
        sum += int(i)
    return sum

def sum_self_number(start, end):
    number_list = list(range(start, end))

    for i in range(start, end):
        has_generator = calculate_generator(i)
        if has_generator in number_list:
            number_list.remove(has_generator)

    sum = 0
    for i in number_list:
        sum += i

    return sum

print(sum_self_number(1, 5000))

2018/07/05 03:43

eun

import sys

r = int(sys.argv[1])
l = list(range(1,r))

for i in range(1,r):
    dn = i + sum(map(int,list(str(i))))
    if dn < r: l[dn-1] = 0

print("{}".format(sum(l)))

2018/07/06 07:12

구름과비

package main

import (
    "strconv"
    "fmt"
)

func main() {
    valArray := make([]int, 5000)
    ret := 0
    for idx:=1 ; idx <= 5000 ; idx++ {
        temp := generator(idx)
        valArray = append(valArray, temp)
    }
    for idx:=1 ; idx <= 5000 ; idx++ {
        count := 0
        for _, val := range valArray {
            if val == idx {
                count++
            }
        }
        if count <= 0 {
            ret += idx
        }
    }
    // result = 1227365
    fmt.Println(ret)
}

func generator(value int) int {
    temp := strconv.Itoa(value)
    sum := 0
    for idx := 0 ; idx < len(temp) ; idx++ {
        val, _ := strconv.Atoi(temp[idx:idx+1])
        sum += val
    }
    sum += value
    return sum
}

2018/07/07 18:14

준섭이

def d(n): return (n+sum([int(x) for x in str(n)]))

a = [d(x) for x in range(1, 5000)] b = [x for x in range(1, 5000) if x not in a] sum(b)

2018/07/08 11:30

최정담

def nummake(a): Array=list() for i in range(len(str(a))): Array.append(str(a)[i]) return sum(list(map(int,Array)))+a A=list() t=10 i=1 while t>0: if nummake(i)>5000: break A.append(nummake(i)) if A.count(nummake(i))>1: A.pop() i+=1 print(5000*5001/2-sum(A))

python3

2018/07/09 12:29

Youngstone422

def generator(number):
    total = number
    sen = str(number)
    for i in sen:
        total += int(i)
    return total

arr = set()
originArr = set()

for i in range(1,5001):
    arr.add(generator(i))

for i in range(1,5001):
    originArr.add(i)

res = list(originArr-arr)

total = 0
for i in range(len(res)):
    total += res[i]

print(total)

2018/07/09 15:55

다정

def d(gen):
    digitSum = gen
    digits = [int(d) for d in str(gen)]
    for i in digits:
        digitSum = digitSum + i
    return digitSum

x = 1
selfSum = 0
while x < 5000:
    i = 1
    while True:
        if d(i) == x:
            break
        elif i < x and d(i) != x:
            i = i + 1
        elif i == x:
            selfSum = selfSum + x
            break
    x = x + 1

print(selfSum)

1227365 넥슨 맨날 욕했는데 반성합니다

2018/07/09 21:26

kkyu

set과 정규식을 이용하여 풀어보았습니다.

import re
allnum=set(range(1,5001))
genernum=set()

for i in allnum:
    spi=re.findall('[0-9]',str(i))
    spiint=map(int,spi)
    sumi=sum(spiint)+i
    genernum.add(sumi)

selfnum=allnum-genernum
selfnumsum=0
for n in selfnum:
    selfnumsum+=n
print(selfnumsum)

2018/07/10 16:20

Jungmin Lee

package com.company;

public class Main {

    public static void main(String[] args) {
        display();
    }

    public static void display() {
        int i = 1;
        int k = 0;
        int[] arr = new int[5000];
        int sum1 = 0;
        for (int j = 0; j <5000; j++){
            sum1 += j;
        }
        while (i < 5000){
            k = get(i);
            if (k < 5000)
                arr[k]++;
            i++;
        }
        for(int n = 0; n < arr.length; n++){
            if (arr[n] != 0){
                sum1 -= n;
            }
        }
        System.out.println(sum1);
    }

    public static int get(int a) {
        int sum = a;
        while (a>=1){
            sum += a%10;
            a = a/10;
        }
        return sum;
    }
}

2018/07/10 18:18

이동수

def makeD(n):
    s = str(n)
    for i in range(len(s)):
        n += int(s[i])

    return n

not_self_number = []
i = 0
while True:
    not_self_number.append(makeD(i))
    if makeD(i) == 5000:
        break
    i += 1

not_self_number.sort()

i = 0
result= 0
while True:
    print(not_self_number[i])
    if not_self_number[i+1] - not_self_number[i] == 0:
        i+=1
    if not_self_number[i+1] - not_self_number[i] == 1:
        i+=1
    if not_self_number[i+1] - not_self_number[i] == 2:
        result+=not_self_number[i] +1
        i+=1

    if makeD(i) == 5000:
        break

print('result:',result)

2018/07/17 11:58

서완길 (선인장물주기)

public class No1 {

public static void main(String[] args)
{
    int arr[] = new int[5001];
    int dn;

    for (int n=1; n<=5000; n++)
    {
        dn = (int) (2*n - 9 * (Math.floor(n/1000) + Math.floor(n/100) + Math.floor(n/10)));
        if(dn <= 5000)
        {
            arr[dn]++;
        }
    }

    int sum = 0;
    for (int i=0; i<arr.length; i++)
    {
        if(arr[i] == 0)
        {
            sum += i;
        }
    }

    System.out.println(sum);
}

}```{.java}

```

2018/07/22 14:09

jong j

#1~5000
s1=set()
s2=set(range(1,5001))
for i in range(1,5001):
    if i<=i and i<=9:
        s1.add(2*i)


    if 10<=i and i<=99:
        F=i//10
        L=i-10*F
        result=F+L+i
        s1.add(result)

    if 100<=i and i<=999:
        F=i//100
        M=(i-100*F)//10
        L=i-100*F-10*M
        result=F+M+L+i
        s1.add(result)

    if 1000<= i and i<=5000:
        F=i//1000
        M_1=(i-1000*F)//100
        M_2=(i-1000*F-100*M_1)//10
        L=i-(1000*F)-(100*M_1)-(10*M_2)
        result= F+ M_1+ M_2+L +i
        s1.add(result)




s3=s2-s1
print(sum(s3))

다들 장난 아니시네요...

저도 나름 최선을 다해봤습니다.

2018/07/24 18:42

IN K

num=c(1:5000);
for(n in num){
        tmp=n+n%%10+(n%/%10)%%10+(n%/%100)%%10+(n%/%1000)%%10;
        num=setdiff(num,tmp);
}
num;
sum(num)

R

2018/07/25 14:14

Song

result = list(range(1,5001))

for i in range(1,5001):
    total = i
    for ch in str(i):
        total += int(ch)

    if(total in result): result.remove(total)

print(sum(result))

2018/07/29 22:24

박용주

#include <stdio.h>
#include <math.h>

int getPst(int n) {
    int pst = 0;
    while (n > 0) {
        n /= 10;
        pst++;
    }
    pst--;

    return pst;
}

int tenPow(int pst) {
    int res = 1;

    int i = 0;
    while (i < pst) {
        res *= 10;
        i++;
    }

    return res;
}

int generate(int n) {
    int pst = getPst(n);
    int res = n;

    int tmp;
    int i = 0;
    while (i <= pst) {
        tmp = n / tenPow(pst - i);
        res += tmp;

        n %= tenPow(pst - i);

        i++;
    }

    return res;
}

int main(void) {
    int arr[5100] = { 0, };

    int i;
    for (i = 1; i <= 5000; i++)
        arr[generate(i) - 1]++;

    int sum = 0;
    for (i = 0; i < 5000; i++) {
        if (arr[i] == 0)
            sum += i + 1;
    }

    printf("%d\n", sum);

    return 0;
}

C언어로 작성해 봤습니다.

2018/07/30 17:51

DeveloperHan

public class Ex004 {

public static void main(String[] args) {
    // 1~5000사이의 셀프 넘버들의 합을 구하라
    int sum = 0;
    for(int i=1 ; i<5000 ; i++) {//기준이 되는값
        int count = 0;
        for(int j=1 ; j<5000 ; j++) {//제너레이터가 되는 것들
            if(i==d(j)) {
                count++;
            }
        }
        if(count==0) {
            //count가 0이면 셀프넘버
            sum+=i;
        }

    }

    System.out.println("셀프넘버의 합 : "+sum);

}


//제너레이터를 구해주는 함수
public static int d(int number) {
    int sum = 0;
    int result = number;
    while(number!=0) {
        sum += number%10;
        number/=10;
    }
    sum+=result;
    return sum;
}

}

2018/07/31 10:17

이명호

C언어로 작성했습니다. 아직 공부하는 도중이고, 조건문 반복문 정도밖에 쓸 줄 모르는지라 아래와 같이 구성했습니다. 그리고, 응용을 위해서는 셀프 넘버를 직접 구해서 합하는 편이 좋겠지만, 아무리 생각해도 셀프넘버를 직접 구하는 방법을 모르겠어서 간접적으로 셀프넘버들의 합만 구했습니다.

#include <stdio.h>
#define sum_of_all (1+4999)*4999/2 /*5000 미만인 모든 자연수의 합*/

int d(n) /*제너레이터 함수*/
{
    char a, b, c, d; /*n의 각 자리 수*/
    a = n / 1000; /*n의 천의 자리 수*/
    b = (n - 1000 * a) / 100; /*n의 백의 자리 수*/
    c = (n - 1000 * a - 100 * b) / 10; /*n의 십의 자리 수*/
    d = (n - 1000 * a - 100 * b - 10 * c); /*n의 일의 자리 수*/
    return a + b + c + d + n;
}

void main(void)
{
    int i = 1, m, sum = 0, sum_of_self_numbers;
    for (i = 1; i < 5000; i++) {
        for (m = 1; m < i; m++) {
            if (d(m) == i) {
                sum += i;
                break;
                /*d(m) == i 이면 m은 i의 제너레이터입니다. 즉, i는 제너레이터가 존재합니다.*/
            }
        }
    }   
    sum_of_self_numbers = (sum_of_all - sum);
    /* 5000미만 자연수의 총합에서 제너레이터가 존재하는 자연수 i의 합을 빼면 셀프넘버의 합을 구할 수 있습니다*/
    printf("1 이상 5000 미만인 모든 셀프 넘버들의 합은 %d 이다.\n", sum_of_self_numbers);
}

1 이상 5000 미만인 모든 셀프 넘버들의 합은 1227365 이다. 계속하려면 아무 키나 누르십시오 . . .

2018/08/06 16:18

이호영

// C#

class Program
{
    static void Main(string[] args)
    {
        int range = 4999;
        Dictionary<int, int> dic = new Dictionary<int, int>();

        int sum = 0;
        for (int num = 1; num <= range; num++)
        {
            sum = 0; //초기화
            foreach (var v in (num).ToString())
            {
                sum += int.Parse(v.ToString());
            }
            sum += int.Parse(num.ToString());
            dic[sum] = sum;
        }

        int total = 0;
        for (int i = 1; i <= range; i++)
        {
            if (!dic.ContainsKey(i))
                total += i;

            Console.WriteLine($"{i}:{total}");
        }
    }
}

2018/08/11 16:01

클루

g = []
for i in range(1,5000):
    for a in str(i):
        i += int(a)
    g.append(i)
sum(set(range(1,5000)) - set(g))

2018/08/16 17:18

김건우


def func(n):
    return eval('+'.join(n[i] for i in range(len(n)))) +int(n)

B = [func(str(n)) for n in range(5000)]
A = [int(n) for n in range(5000) if n not in B]
print(sum(A))

2018/08/18 14:44

S.H

package practice;

public class test {
    public static void main(String[] args) {
        int[] ft = new int[5000]; 
        int sum = 0;
        for(int i=0 ; i<5000 ; i++) {
            ft[i] = i+1;
            for(int j=0;j<5000;j++) {
                if(ft[i]==n(j+1)) {
                    ft[i]=0;
                }
            }
            sum += ft[i];
        }
        System.out.println(sum);        


    }

    private static int n(int g) {
        return g/1000 + (g%1000) / 100 + (g % 100) / 10 + g % 10 + g;
    }


}

2018/08/18 20:36

김성우

def gen(n):
    a = str(n)
    lst = list(a)
    b = n
    for i in lst:
        b = b + int(i)
    return b

N = 5000
scope = 5036  # scope = N + 9*[log(N)+1]
i = 1
gen_lst = []
while i < scope:
    gen_lst.append(gen(i))
    i = i + 1

i = 1
self_sum = 0
while i < N:
    if i in gen_lst:
        self_sum = self_sum
        i = i + 1
    else:
        self_sum = self_sum + i
        i = i + 1

print(self_sum)

저는 python을 사용하였습니다. 1~N까지 셀프넘버를 탐색을 할 때 (이 문제에선 N=5000) 또 다른 범위 하에서 제너레이터 함수를 수행하여 "주어진 수가 셀프넘버인가?" 를 판단하도록 하였습니다. 자릿수를 고려했을 때 N + 자릿수의 최댓값 만큼을 새로운 범위로 주었습니다.

2018/08/20 20:24

aa

def d(n):
    summ=n
    for i in range(int(np.log10(n))+1):
        summ=summ+int((n/10**i)%10)
    return summ

#d(n)의 n을 제너레이터 n이 없는 d(n)을 self number이라 한다.

s0=set([]) #1~5000의 숫자
s1=set([]) #d(n)의 셋

#1~5000의 숫자 중 s1에 속하지 않는 숫자는 self number이다.

s2=set([])

for i in range(5000):
    s0.add(i+1)
    s1.add(d(i+1))

s2=s0-(s0&s1)

total=0
for k in s2:
    total=total+k

print(total)

2018/08/22 01:47

JW Yoo

lst = []
lst.extend(range(1, 5000))

for n in range(1, 5000):

    tmp_ft = 0
    tmp_sum = 0

    str_n = str(n)
    for m in str_n:
        tmp_ft += int(m)
    tmp_sum = tmp_ft + n

    if tmp_sum <= 5000 and tmp_sum in lst:
        lst.remove(tmp_sum)

print(lst)

2018/08/22 16:29

이충각

def selfnumber(min,max):
    a = [i for i in range(min,max)]
    for num in range(min,max):
        notself = num+sum(map(int,str(num)))
        if notself in a:
            a.remove(notself)
    print(a)
    return sum(a)


print("result = ",selfnumber(1,5000))

2018/08/26 21:12

박수영


public class cd365 {

    private static final int MAX = 5000;

    public static void main(String[] args) {

        int i = 0, num = 0;
        int sum = 0;

        boolean[] notSelfNum = new boolean[MAX + 1];

        for (i=1; i<=MAX; i++) {
            num = 0;

            // generator
            String sn = String.valueOf(i);
            for (int chrIdx = 0; chrIdx < sn.length(); chrIdx++) {
                num += Integer.parseInt(String.valueOf(sn.charAt(chrIdx)));
            }
            num += i;

            // check
            if (num <= 5000 && !notSelfNum[num]) {
                notSelfNum[num] = true;
            }
        }

        // sum
        for (i=1; i<=MAX; i++) {
            if (!notSelfNum[i]) {
                sum+=i;
            }
        }

        System.out.print(sum);

    }
}

2018/08/26 23:27

송세현

public class Generator {
    private static int n = 5000;
    private static boolean[] isSelfNumber = new boolean[n];

    public static void main(String[] args) {

        for(int i=1; i<n; i++) {
            int generator = createGenerator(i);
            if(generator>0 && generator<n) {
                isSelfNumber[generator] = true;
            }
        }
        System.out.println("셀프 넘버들의 합: " + aggregateSelfNumbers());
    }

    public static int createGenerator(int num) {
        String number = String.valueOf(num);
        int tot = 0;

        for(int i=0;i<number.length();i++) {
            tot += number.charAt(i) - 48;
        }
        return tot + num;
    }

    public static int aggregateSelfNumbers() {
        int tot = 0;
        for(int i=0;i<isSelfNumber.length;i++) {
            if(isSelfNumber[i]==false) {
                tot += i;
            }
        }
        return tot;
    }
}

2018/08/28 12:38

남시욱


r = range(1, 5000)
allNumbers = set(r) 
generatorNumbers = set(d_fn(n) for n in r)
selfNumSet=allNumbers-generatorNumbers
print(selfNumSet)
print( sum(selfNumSet) ) 

2018/08/29 03:01

막무가내

#include<stdio.h>

int d(int n) {
    int thou = n % 1000;
    int hun = n % 100 - 10 * thou;
    int ten = n % 10 - 100 * thou - 10 * hun;
    int one = n - 1000 * thou - 100 * hun - 10 * ten;
    int x = thou + hun + ten + one + n;
    return x;
}


int main()
{
    int self_sum = 0;
    int self_arr[5100];
    for (int i = 0; i < 5000; i++)
    {
        self_arr[i] = 0;
    }
    for (int i = 1; i <= 5000; i++)
    {
        self_arr[d(i)]=d(i);
    }
    for (int i = 1; i <= 5000; i++)
    {
        if (self_arr[i] == 0)
            self_sum += i;
    }
    printf("%d\n", self_sum);
}

2018/08/29 16:36

이종희

l2 = sum(set(range(1,5000))-{sum([int(a) for a in str(x)])+x for x in range(1,5000)})
print(l2)

2018/09/01 15:02

오왕씨

a=set(range(1,5000))
b=set()

for x in range(1,5000):
    res=x
    for i in str(x):
        res+=int(i)
    b.add(res)

print(sum(b))

2018/09/03 15:54

전형진

# Python
def generator(n):# 생성자
    s = n
    while n > 0:
        s += n % 10
        n //= 10
    return s

print(sum([i for i in range(1, 5000) if i not in [generator(i) for i in range(1, 5000)]]))

2018/09/03 23:08

김우재

public static void main(String[] args) {
        // TODO Auto-generated method stub

        int sum = 0;
        int max = 5031;
        int[] genNumber = new int[max];
        for (int i = 1; i < 5000; i++) {
            int gen = generator(i);
            genNumber[gen] = 1;

        }
        for (int j = 1; j < genNumber.length; j++) {
            if(genNumber[j] != 1 && j < 5000) {
                System.out.println(j);
                sum += j;
            }
        }


        System.out.println("==============sum:"+sum);
    }

    public static int generator(int number) {
        int res = number;

        if(number >= 10000) {
            res += number /10000;
            number %= 10000;
        }
        if(number >= 1000) {
            res += number /1000;
            number %= 1000;
        }

        if(number >= 100) {
            res += number /100;
            number %= 100;
        }
        if(number >= 10) {
            res += number /10;
            number %= 10;
        }
        return res += number;
    }

2018/09/14 10:57

강창열


public class main {

    static int list[] = new int[5001];

    public static void main(String[] args) {

        for(int i=1;i<=5000; i++) { findNum(i); }

        int sum = 0;

        for(int i=1;i<=5000;i++) {
            if(list[i] == 0) 
                sum += i;
        }

        System.out.println(sum);
    }
    public static void findNum(int N) {

        String str = String.valueOf(N);

        int sum=0;
        for(int i=0;i<str.length();i++) 
            sum += Integer.parseInt(str.substring(i, i+1));

        sum += N;
        if(sum <= 5000 && list[sum] == 0)
            list[sum] = 1;

    }
}

자바입니닷

2018/09/19 00:43

이상민


HashSet intSet = new HashSet<>();
    public int sumSelfNumber() {
        int result = 0;
        for(int i=1;i<=5000;i++) {
            intSet.add(sumDigit(i)+i);      
        }
        for(int i=1;i<=5000;i++) {
            if(!intSet.contains(i)) {
                result+=i;
            }           
        }
        return result;
    }
    public int sumDigit(int number) {
        int result = 0;
        if (number<10)
            return number;

        if (number>=1000) {
            result = number/1000;
            number = number- result*1000;
        } else if (number>=100) {
            result = number/100;
            number = number- result*100;
        }else if (number>=10) {
            result = number/10;
            number = number- result*10;
        }   
        return sumDigit(number)+result; 
    }

고수분들이 엄청 많네요

2018/09/19 12:25

길경완

// ===============================================
    public static void main(String[] args) {

        int[] n1 = new int[5001];
        for (int i = 1; i < n1.length; i++) {
            if (i < n1.length - 1) {
                if (g(i) < n1.length) {
                    n1[g(i)] = 1;
                }
            }
        }
        int temp = 0;
        for (int i = 0; i < n1.length; i++) {
            if (n1[i] == 0)
                temp += i;
        }
        System.out.println(temp);
    }

    private static int g(int num) {
        int sum = num;
        while (num != 0) {
            sum += num % 10;
            num = num / 10;
        }
        return sum;
    }

2018/09/19 20:04

채규빈


int generator;
int generated_value(int generator)
{
    return (generator/1000 + (generator/100 - generator/1000 * 10) + (generator/10 - (generator/100 * 10)) + generator%10 + generator );

}

int main(void)
{
    int i;
    int result = 0;
    int result2 = 0;
    int d[5001] ;
    int j;
    int p;



    for(i=1; i<5001; i++) // generator로 만들어진 값 중 5000이 넘는 것은 0으로 처리 
    {
        d[i] = generated_value(i);

        if(d[i] >= 5000) {

        d[i] = 0;
        }
    }



    for(j=1; j<5001; j++) // 중복제거를 위한 알고리즘 
    {

        for(p=1; j+p<5001; p++)
        {

        if(d[j] == d[j+p]){

            d[j+p] = 0 ; 

        }  

        }
    }


    for(j=1; j<5001; j++)
    {
        result += d[j];

    }



    for(i=1; i<5000; i++)
    {

    result2 += i;

    }

    printf("1에서부터 5000보다 작은 자연수 중 중복되지 않으면서 generator로 만들어진 값들의 합: %d\n", result);

    printf("1에서부터 5000보다 작은 자연수들의 합: %d\n", result2);

    printf("1에서부터 5000보다 작은 자연수 들 중 generator로 만들어 지지 않은 셀프 숫자들의 합, 즉 2행의 값에서 1행의 값을 뺀 값: %d\n", result2 - result);

    // c언어로 풀었습니다. 가장 이해하기 쉽게 풀었다고 생각합니다.

    system("pause");

    return 0;

}

2018/09/21 17:22

민수천재

#include <stdio.h>

int main(void){

    int a,b,c,d,i,j=0;
    int n1,n2,n3,n4,sum;  // n1,n2,n3,n4는 각각 천,백,십,일의 수 
    int dnums[5000], nums[5000]; // d(n)의 배열과 자연수의 배열 

    for(i=0;i<5000;i++)   // 연속적인 자연수의 배열 생성  
        nums[i]=i; 

    for(a=0;a<5;a++){     // 반복문을 이용하여 모든 n에 대한 d(n)의 배열 생성  
        for(b=0;b<10;b++){ 
            for(c=0;c<10;c++){
                for(d=0;d<10;d++){
                    dnums[j] = f_d(a,b,c,d);
                    j++;
                }
            }
        }
    } 

// 자연수 중에서 d(n)의 원소와 일치하는 원소가 있으면 0으로 초기화 
    for (i=0;i<5000;i++){ 
        for (j=0;j<5000;j++){
            if(dnums[j]==nums[i])
                nums[i]=0;  
        }
    }

// d(n)과 공통집합이 존재하지 않게 초기화 된 num 함수의 원소를 모두 더해 sum에 저장 
    for(i=0;i<5000;i++)
        sum +=nums[i];

    printf("sum of self numbers(0<n<5000) is %d",sum);

    return 0;
}

// 함수 d(n) 
int f_d(n1,n2,n3,n4){
    int d_n;
    d_n = 1001*n1 + 101*n2 + 11*n3 + 2*n4;

    return d_n;
}

컴공새내기 기본적인 c언어 배열로 풀어봤습니다.

2018/09/25 00:20

subzero_99

public class DojangQize03{
    public static void main(String[] args) {
        int cnt = 0;
        int sum = 0;
        for(int n = 1; n < 5000; n++) {
            for(int a = 0; a < 10; a++) {
                for(int b = 0; b < 10; b++) {
                    for(int c = 0; c < 10; c++) {
                        for(int d = 0; d < 10; d++) {

                            String eTemp = "" + a + b + c + d;
                            int e = Integer.parseInt(eTemp);

                            if(a + b + c + d + e == n) {
                                cnt++;
                            }
                        }
                    }
                }
            }
            //boolean self_number = cnt >= 1 ? true : false;
            if(cnt == 0) {
                sum += n;
            }
            cnt = 0;
        }
        System.out.println("셀프 넘버들의 합: " + sum);
    }
}

셀프 넘버들의 합: 1227365

2018/09/26 13:00

Ju Wonjin

include

int main(void){ int chk = 0, sum = 0, temp_i = 0, gen[5000]; for(int i = 0; i < 5000 ; i++) gen[i] = i+1;

for(int i = 1; i <= 5000 ; i++)
{
    temp_i = i;
    for(int j = 10 ; temp_i > 0 ; temp_i = temp_i / 10 )
    {

        chk = chk + temp_i % (j);

    }
    chk = chk + i;
    if(chk <= 5000)
        gen[chk-1] = 0;
    else
        break;
    chk = 0;
}

for(int i = 0; i < 5000 ; i++)
{
    sum = sum + gen[i];
}

printf("%d",sum);
return 0;

}

2018/09/28 21:56

맹근동

#include <iostream>
using namespace std;

#define SIZE 5001

int b(int num) {

    int sum = num;

    if (num > 10) {
        while (num > 10) {
            sum += num % 10;
            num = num / 10;
        }
        sum += num;
    }
    return sum;
}


int main() {

    int i = 1;
    int SelfNumberSum = 0;
    bool *checkSelnum = new bool[SIZE];
    memset(checkSelnum, false, SIZE * sizeof(bool));

    for (i=1; i < SIZE; ++i) {
        if(b(i) < SIZE)
            checkSelnum[b(i)] = true;
    }
    for (i=1; i < SIZE; ++i) {
        if (checkSelnum[i] != true)
            SelfNumberSum += i;
    }

    cout << "SelfNumberSum : " << SelfNumberSum << endl;

    system("pause");
    delete[] checkSelnum;
    return 0;
}

c++로 풀어봤습니다.

2018/09/29 15:56

박상준

C++. 결과 1227365. 수만큼 배열선언하여 1~5000까지 각 값을 넣은 후, 제네레이터 수만 0으로 변경. 배열엔 셀프넘버만 남음.

#include <iostream>

int d(int num) {
    int temp = num;
    while (temp > 0) {
        num += temp % 10;
        temp /= 10;
    }

    return num;
}

void main() {
    const int maxArrNum = 5000;

    int numArr[maxArrNum + 1] = { 0, };

    for (int i = 1; i <= maxArrNum; ++i) {
        numArr[i] = i;
    }

    for (int i = 1; i <= maxArrNum; ++i) {
        int temp = d(i);
        if (temp <= maxArrNum) {
            numArr[temp] = 0;
        }
    }

    int sum = 0;
    for (int i = 1; i <= maxArrNum; ++i) {
        sum += numArr[i];
    }

    std::cout << sum << std::endl;
}

2018/10/02 17:01

Pond

public class selfNumber {

public static int[] divd(int n) {       
    String a = Integer.toString(n);
    int[] di = new int[5];
    for(int i=0; i<a.length(); i++) {
        di[i] = a.charAt(i)-'0';
    }
    di[a.length()] = n;

    return di;      
}


public static int sum(int[] ar) {
    int sum = 0;
    for(int i=0; i< ar.length; i++) {
        sum += ar[i];
    }

    return sum;
}




public static void main(String[] args) {

    int[] sm = new int[5031];

    for(int i=1; i<5000; i++) {
        sm[sum(divd(i))] = 1;       
    }

    int SumOfSelf=0;

    for(int i=0; i<sm.length; i++) {
        if(sm[i]!=1) {
            SumOfSelf += i;
        } 
    }

    System.out.println(SumOfSelf);
    }

}

2018/10/04 15:04

김찬영

selfnumber=list()
for i in range(1,5000):
    selfnumber.append(i)

for j in range(5000):
    quotient=j//10
    j+=j%10
    while quotient>10:
        j+=quotient%10
        quotient//=10
    j+=quotient
    if j in selfnumber:
        selfnumber.remove(j)
a=0
for number in selfnumber:
    a+=number

print(a)

제 코드에서 답이 103차이가 나는데 제가 알지 못한 실수한 곳이 있나요??

2018/10/15 13:23

김재웅

u=[]

for n in range(0,5000):
    a= int(n//1000)
    b=int((n-1000*a)//100)
    c=int((n-1000*a-100*b)//10)
    d=int((n-1000*a-100*b-10*c)//1)

    t = n+a+b+c+d
    u.append(t)

sum_=0
for i in range(5000):
    if i not in u: 
        sum_+=i
print(sum_)

2018/10/17 17:52

Sukamuljo


public class generator {

    public static void main(String[] args) {
        int sum=0;
        int[] arr=new int[5000];
        int[] arr1=new int[5000];

        for(int i=0;i<5000;i++)
            arr[i]=i/1000+i%1000/100+i%1000%100/10+i%1000%100%10+i;
        //d(n)에 해당하는 배열 생성
        for(int i=0;i<5000;i++)
            arr1[i]=i+1;
        //1-5000을 가지는 배열 생성
        for(int i=0;i<5000;i++)
            for(int j=0;j<5000;j++)
                if(arr1[i]==arr[j])
                    arr1[i]=0;
        //서로 비교해서 1-5000을 가지는 배열에서 겹치는 숫자를 0으로 바꿈

        for(int i=0;i<5000;i++)
            sum+=arr1[i];

        System.out.println("1-5000중 셀프 넘버의 합은:"+sum);
    }
}

결과:1-5000중 셀프 넘버의 합은:1227365

2018/10/17 21:02

이동준

def sum_number(x) :
    result = x % 10 
    if (x // 10) > 0 :
        result += sum_number(x // 10)
    return result

self_list = [x for x in range(5000)]

for x in range(5000) :
    if sum_number(x) + x >= 5000 :
        continue
    self_list[sum_number(x) + x] = 0

sum(self_list)

2018/10/23 19:02

김성목

C++ 로 작성하였습니다

vector<int> generator;

    int answer = 0;
    for (int i = 1; i < 5000; i++) {
        int n = i, multiply = 10, oneTotal = 0;
        while (n >= 1) {
            oneTotal += n % multiply;
            n /= 10;
        }
        generator.push_back(i + oneTotal);
    }

    for (int i = 0; i < 5000; i++) {
        vector<int>::iterator it;
        it = find(generator.begin(), generator.end(), i);
        if (it == generator.end())
            answer += i;
    }

    cout << answer;

2018/10/24 23:44

dakang

using System;

class SumOfSelfNumbers
{
    public int Calculate(int maxNumber)
    {
        if (maxNumber <= 0)
        {
            return 0;
        }

        var totalNumbers = new int[maxNumber + 1];
        for (var i = 0; i <= maxNumber; ++i)
        {
            totalNumbers[i] = i;
        }

        for (var i = 1; i <= maxNumber; ++i)
        {
            var num = CheckGenerator(i);
            if (num > 0 && num <= maxNumber)
            {
                totalNumbers[num] = 0;
            }
        }

        var sum = 0;
        foreach (var num in totalNumbers)
        {
            sum += num;
        }

        return sum;
    }

    private int CheckGenerator(int gen)
    {
        var value = gen;

        while (gen > 0)
        {
            value += gen % 10;
            gen /= 10;
        }

        return value;
    }

    static void Main(string[] args)
    {
        var sumSelfNums = new SumOfSelfNumbers();
        var sum = sumSelfNums.Calculate(5000);

        Console.WriteLine("Result Sum : " + sum);

        Console.ReadKey();
    }
}
  • 결과 Result Sum : 1227365

2018/11/01 00:55

prozard

public class Test
{
    public static void main(String[] args)
    {
        boolean[] arr = new boolean[5000];

        int f1;


        for(f1=0;f1<arr.length;f1++)
        {
            arr[f1]=true;
        }

        int res;
        for(f1=1;f1<arr.length;f1++)
        {
            res=d(f1);

            if(res <5000)
            {
                arr[res]= false;
            }
        }

        int sum=0;
        for(f1=1;f1<arr.length;f1++)
        {
            if(arr[f1])
            {
                sum+=f1;
            }
        }

        System.out.println("결과 : "+sum);


    }

    static int d(int n)
    {
        int res=n;

        while (n!=0)
        {
            res +=n%10;
            n=n/10;
        }

        return res;
    }

}

2018/11/01 10:17

김상협

def d(n):
    n=int(n)
    m=str(n)
    total=0
    for i in range(len(m)):
        total+=int(m[i])
    return total+n

dlist=[]
for i in range(1,5000):
    dlist.append(d(i))

dset=set(dlist)
b=set(range(1,5000))
a=b-dset
print(sum([int(i) for i in a]))

2018/11/03 16:06

recette

public class Stating {
    public static void main(String args[]) {
        int num = 1000;
        int[] nums = new int[num];
        for(int i = 1; i < num + 1; i++) {
            int chk = add(i);
            if(chk < num) {
                nums[chk - 1] = 1;
            }
        }
        for(int i = 0; i < num; i++) {
            if(nums[i] == 0) {
                System.out.print(( i + 1)+",");
            }
        }

    }
    static int add(int num){
        int cnt = num;
        boolean flag = true;
        while(flag) {
            cnt += num % 10;
            num /= 10;
            if(num == 0) {
            flag = false;   
            }
        }
        return cnt;
    }
}

2018/11/04 18:10

최시우

def Generate_Number() :
    A=[]
    for i in range (1,5000) :
        sum_i =i
        #10이하인 수
        if(len(str(i))==1) :
            sum_i+=i          
            A.append(sum_i)
        #10이상인 수
        else :
            #10의 n승 자리 숫자 가져오기
            for j in range (len(str(i))-1, -1,-1) :
                sum_i+=int(str(i)[j])*pow(10,j)
            A.append(sum_i)  
        sum_i=0
    return A        

NUM=Generate_Number()
RES=[]
for n in range(1,5000) :
    if n not in RES :
        RES.append(n)
print(sum(RES))

2018/11/05 22:46

쨔이

#include <stdio.h>

int main(void)
{
    int n = 0;
    int totNum= 0;
    int sum= 0;
    int selfNum= 0;
    int ret= 0;

    totNum = (1+5000)*(5000/2);

    while(n < 5000)
    {
        selfNum = n + (int)(n*0.1) + (int)(n*0.01) + (int)(n*0.001) + (int)(n*0.0001);

        if(selfNum <= 5000)
        {
            sum += selfNum;
        }
        n++;
    }

    ret = totNum - sum;
    printf("Result : %d \n",ret);
    return 0;
}

2018/11/09 12:40

Lee

def d(n):
    sum=n
    letters = str(n)
    for i in range(0,len(letters)):
        k=letters[i]
        sum = sum + int(k)
    print(sum)

def find_self_number():
    self_number=[]
    for i in (1,5000):
        for j in (1,i):
            if d(j)==i:
                self_number.append(i)
            else:
                pass
    print(self_number)

2018/11/09 15:03

배득주

def generator(n):
    generator = []
    for s in range(n):
        k = 0 #keep
        for i in str(s):
            k += int(i)
        k += s
        if k == n:
            generator.append(s)
    return generator


self = 0
for num in range(1, 5000):
    if not generator(num):
        self += num
print(self)

2018/11/11 20:09

그사람 남한 볼 수 있어요

alist = []#셀프넘버가 아닌 수 리스트
blist = []#1이상 5천미만

a=0
b=0

while True: #셀프넘버가 아닌 수들 구하기
    a = int(a)
    a += 1
    a = str(a)

    if len(a) == 1:
        b = int(a)+int(a)
        alist.append(b) 

    elif len(a) > 1 :
        b=int(a)
        for i in range(0,len(a),1):
            b+=int(a[i])

        if b < 5000:
            alist.append(b)
        else:
            break


for i in alist : #셀프넘버가 아닌 수 리스트에서 중복값 제거
    if alist.count(i) >= 2 :
        delcount = alist.count(i)
        for d in range(1,delcount,1):
            alist.remove(i)


for i in range(1,5000,1):
    blist.append(i)

for i in alist : #1이상 5천미만 수 리스트에서 셀프넘버가 아닌 수들 제거
    blist.remove(i)

print(sum(blist))

2018/11/12 14:04

임채원

# python 3.7.1

k = set(range(1,5000))
j = set()

for i in range(1, 5000):
    numlist = [int(x) for x in list(str(i))]
    j.add(sum(numlist)+i)

print(sum(k - j))

2018/11/13 15:55

정지환

list1= []
list2= []


def d(n):
    sum = 0
    spt = str(n)
    for i in range(len(spt)):
        sum += int(spt[i])
    return int(sum + n)


for i in range(5000):
    list1.append(d(i))

for j in range(5000):
    list2.append(j)
s1 = set(list1)
s2 = set(list2)

print(sum(s2-s1))

2018/11/13 18:55

문지원

Java 8

public class tut06 {
  public static void main(String[] args) {
    Integer num1 = 5000;
    System.out.println(
        (int) (IntStream.rangeClosed(1, 5000).sum()) - // 1~5000 총합 
        (int) (IntStream.rangeClosed(1, 5000)          // generator 총 Sum
                .map(i -> ("" + i).chars().map(j -> Character.getNumericValue(j)).sum() + i)
                .filter(i -> i <= 5000)
                .distinct()
                .sum()));

  }
}

2018/11/19 17:56

#include <iostream>
#include <cmath>
using namespace std;

int getgen(int n){
    if(n<10) return n;
    int a;
    for(int i=0;pow(10,i)<=n;i++) a=i;
    return n/(int)pow(10,a)+getgen(n %(int)pow(10,a));
}

int main(){

    int a[5000];
    int n=0;
    int sum=0;
    for (int i=0;i<5000;i++){
        a[i]=i+1;
    }
    for(int i=0;i<5000;i++){
        n=getgen(i+1)+i+1;
        if(n>0&&n<5000) a[n]=0;
    }
    for(int i=0;i<5000;i++){
        sum+=a[i];
    }
    cout<<"answer:"<<sum<<endl;
}

2018/11/20 21:42

김한길

def selfnumber(num):
    generator=list()
    for idx in range(1,num+1):
        head=idx//10
        tail=idx%10
        if head+tail+idx==num:
            generator.append(idx)
    if not generator: return True
    else: return False

num=5000
selfnum=list()
for idx in range(1,num+1):
    if selfnumber(idx): selfnum.append(idx)

print(sum(selfnum))

답은 1135243

2018/11/22 12:13

SummerEast

Generator.py

def generator(n): digit=list(str(n)) rlt=0 for i in digit: rlt=rlt+int(i) rlt=rlt+n return rlt

num=[] i=1 while i<5000: num.append(i) i=i+1 print(num)

j=1 while j<5000: key = generator(j) if num.count(key) >= 1: num.pop(num.index(generator(j)))

j=j+1

print(num)

1~5000까지있는 list에서 generator를 제거하는 형태로 만들었습니다.

2018/11/22 17:24

EunKyung Jung

box = set()
ans = int()

for num in range(5000):
    ad = int()
    for si_num in str(num):
        ad += int(si_num)
    gen = num + ad
    box.add(gen)

for no in range(5000):
    if not(no in box):
        ans += no

print(ans)

2018/11/28 19:27

현모구

def d(n): strn = str(n) return sum([int(i) for i in strn]) + n

def find_result(n): gen = [0]*10000 idx = 0

for i in range(n+1):
    idx = d(i)
    gen[idx] += 1
return gen

res = find_result(5000)

sum = 0

print(res[1:5000])

for i in range(1,5001): if res[i] == 0: sum += i

print(sum)

2018/12/05 16:25

minhwasoo

def d(n):

    if type(n) != int or n<=0:
        quit()
    elif 1<=n<10:
        return 2*n
    elif 10<=n<100:
        return n//10 + n%10 + n
    elif 100<=n<1000:
        return n//100 + n//10%10 + n%10 +n
    elif 1000<=n<10000:
        return n//1000 + n//100%10 + n//10%10 + n%10 + n

list = [x for x in range(1,5000)]

for x in range(1, 5000):
    if d(x) in list:
        list.remove(d(x))
    else:
        continue

print(sum(list))

2018/12/16 19:08

김형선

def d(n):
    return sum([ int(n[i]) for i in range( len(n) )]) + int(n)


print( d(100) )

2018/12/17 17:19

윤종백

def d(n):
    return n // 1000 + n // 100 + n // 10 + n % 10 + n


sum = 0
for i in range(5001):
    sum += i

generator = set()
for j in range(5001):
    if d(j) <= 5000:
        generator.update([d(j)])

generator_sum = 0
for k in generator:
    generator_sum += k

print(sum)
print(generator_sum)
print(sum - generator_sum)

2018/12/19 14:23

달품

public class SelfNumber {

    public static void main(String[] args) {
        //값을 체크할 배열생성
        boolean[] b = new boolean[5000];
        int sum = 0;
        for(int i = 1; i < 5000; i++) {
            int temp = 0;
            String s = Integer.toString(i);
            //문자로 변환 후 각자리 합 계산
            for(int j = 0; j < s.length(); j++) {
                temp += s.charAt(j) - '0';
            }
            temp += i;
            if(temp < 5000) {
                //결과를 해당 index에 적용
                b[temp] = true;
            }
        }
        for(int k = 1; k < b.length; k++) {
            if(b[k] == false) {
                //셀프넘버 합계계산
                sum += k;
            }
        }
        System.out.println("합 : " + sum);
    }
}

2018/12/19 22:04

이동훈

generators = {n + sum(map(int,str(n))) for n in range(1, 5000 + 1)}
self_numbers = set(range(1,5000 + 1)).difference(generators)

print(sum(self_numbers))

2018/12/20 13:42

눈떠담

a = []
for x in range(1,5000):
    for i in str(x):
        x += int(i)
    a.append(x)

sum(set(range(1,5000))-set(a))

2018/12/20 16:25

김혜인

다른 분 코드를 참고했습니다 =_=;

((1 to 5000) diff ((1 to 5000).map(x => x.toString.map(_.asDigit).sum + x)).distinct).sum

2018/12/26 20:05

Daesap Kim

namespace codingdojang__
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> total = new List<int>();

            HashSet<int> hashtemp = new HashSet<int>();

            int temp = 0;

            int tem = 0;

            int te = 0;

            for (int num = 1; num < 5000; num++)
            {
                char[] ch = num.ToString().ToCharArray();

                foreach (var tempo in ch)
                {
                    temp += int.Parse(tempo.ToString());
                }

                temp += num;

                if (temp < 5000)
                {
                    total.Add(temp);
                }

                temp = 0;
            }

            foreach (int hasht in total)
            {
                hashtemp.Add(hasht);
            }

            for (int temnum = 0; temnum < 5000; temnum++)
            {
                tem += temnum;
            }

            foreach (var tempnum in hashtemp)
            {
                te += tempnum;
            }

            Console.WriteLine(tem - te);
        }
    }
}

답 - 1227365

2018/12/29 00:04

bat

# self_number.py
def generator(num):
    gen_result = 0
    num2str = str(num)
    for i in range(0,len(num2str)):
        gen_result += int(num2str[i])
    gen_result += num
    return gen_result

Total_set = set(range(1,5000))

for i in range(1,5000):
    if generator(i) < 5000 and generator(i) in Total_set:
        Total_set.remove(generator(i))

print(sum(Total_set))

답 : 1227365

2019/01/02 14:55

판다네밥상

number = [i for i in range(1, 5000)]
for i in range(1, 5000):
    if (i + sum(map(int, list(str(i))))) in number :
        number.remove(i + sum(map(int, list(str(i)))))
    else : continue
print(sum(number))

2019/01/04 00:16

lucky1to10

public class self_num {
    private static int getNum(int num)
    {
        int ret = 0;
        while (num > 0)
        {
            ret += num % 10;
            num /= 10;
        }
        return ret;
    }
    public static void main(String[] args)
    {
        boolean[] arr = new boolean[5000];
        int sum = 0;
        for (int i = 0; i < 5000; i ++)
        {
            sum = 0;
            sum += getNum(i);
            sum += i;
            if (sum >= 1 && sum <= 5000)
            {
                arr[sum - 1] = true;
            }
        }
        int finalNum = 0;
        for (int i = 0; i < arr.length - 1; i++)
        {
            if (!arr[i])
            {
                finalNum += (i+1);
            }
        }
        System.out.println(finalNum);
    }
}

2019/01/04 21:54

김민지

#include <stdio.h>

int main(){
 int c=0, sumA=0, sumB=0, i=0, j=0, j1=0, j2=0;

 for(i=0;i<5000;i++)
  sumA+=i;

 for(i=0;i<5;i++)
  for(j=0;j<10;j++)
   for(j1=0;j1<10;j1++)
    for(j2=1;j2<10;j2++){
     c = (i*1000)+(j*100)+(j1*10)+(j2*1);
     sumB+=c;
    }

 sumA= sumA-sumB;
 printf("셀프 넘버들의 합은 %d 입니다.\n",sumA);
 return 0;
} 

2019/01/06 16:35

Kyle

self_num=[]
gen_lists=[]
for i in range(1,5000,1):

    for j in range(1,i,1):
        num=[]
        num=list(str(j))

        sum=0
        for x in num:
            sum=sum+int(x)
        result=sum+j

        if (result==i):
            gen_lists.append(i)
    if i not in gen_lists:
        self_num.append(i)


print(self_num)

제 코드 문제 엄청 많은 거 아는데.. 개발을 해본적 없이 문법배우면서 시작하느라 어디를 어떤식으로 고쳐야하는지 잘 모르겠어요 제 생각엔 불필요하게 연산을 너무 많이하게 짠 것 같은데 어디를 어떤식으로 고쳐야할지 조언해주실 분 계실까요??

2019/01/07 17:05

kimdubi

status_self = 1 # 셀프 넘버 인지 아닌지 여부 체크 변수
sum_self = 1  # 셀프 넘버 합 값
check_sum = 0 # 셀프 넘버 인지 체크 하기 위한 변수
self_number = range (2,5000) # 1은 셀프 확정 
for i in self_number :
    status_self = 1
    sub_number = range(1,i)
    for j in sub_number :
        check_sum = 0
        if j < 10 :
            check_sum = j + j
        elif j < 100 :
            check_sum = j + (j % 10) + (j//10)
        elif j < 1000 : 
            check_sum = j + (j % 10) + ((j//10)%10) + (j//100)
        elif j < 10000 :
            check_sum = j + (j % 10) + ((j//10)%10) + ((j//100)%10) + (j//1000)

        if check_sum == i :
            status_self = 0
            break
    if status_self == 1 :
        sum_self = sum_self + i

print(sum_self)

2019/01/08 14:41

오재혁

public class SelfNumber {

    private static int checkGenerator(int n)
    {
        int sum = n;
        for(int i=0; i<String.valueOf(n).length(); i++)
        {
            sum += n%10;
            n /= 10;
        }
        return sum;
    }

    public static void main(String[] args) {
        // 1~5000까지의 수에서 제네레이터가 없는 셀프넘버들의 합계를 구하라.
        // 제네레이터란 :
        // 91의 각 자릿수에 자기자신을 더하면 (9 + 1 + 91) 101이 나온다.
        // 이 때 91은 101의 제네레이터라고 한다.

        int answer=0;
        boolean[] isGenerator = new boolean[5000];

        // 모두 false로 채우고 제네레이터 여부를 검사해서 true로 변경한다.
        for(int i=0; i<5000; i++)
        {
            int result = checkGenerator(i);
            if(result >= 1 && result <= 5000)
                isGenerator[result-1] = true;
        }
        for(int i=0; i<5000; i++)
        {
            if(isGenerator[i] == false)
                answer += (i+1);
        }
        System.out.println(answer);
    }

}

2019/01/08 18:32

장지훈

#include<stdio.h> 

int main()
{
    int mok, nam;
    int i,j;
    int sum = 0;
    int index[5000] = { 0 };
    for (i = 1; i <= 5000; i++)
    {
        sum = 0;
        mok = i;

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


        sum = sum + i;
        if(sum<5000)
            index[sum] = 1;
    }
    sum = 0;
    for (j = 0; j <= 4999; j++)
    {
        if (index[j] == 0)
        {
            sum = sum + j;

        }

    }
    printf("%d", sum);

    return 0;
}

2019/01/13 00:22

흐긴노노

limit = 5000
gen_limit = limit + (len(str(limit)) - 1)*9
pairs = {}
i = num = 0
while num < gen_limit:
    num = i + sum([int(ch) for ch in str(i)])  # generator
    pairs[i] = num
    i += 1

sorted_val = sorted(pairs.values())
sum_snum = 0
for snum in range(0, limit):
    if snum not in sorted_val:
        sum_snum += snum
print(sum_snum)

2019/01/19 18:53

Roy

#include<list>
#include<iostream>



using namespace std;

int main(void)
{
    int notself = 0;
    int number = 0;
    list<int>ls;
    list<int>::iterator ltr;
    for (int i = 1; i < 5000; i++)
    {
        number += i;
        int num0 = i / 1000;
        int num1 = (i % 1000) / 100;
        int num2 = (i % 1000) % 100 / 10;
        int num3 = ((i % 1000) % 100) % 10;
        int num = i;
        int total = num0 + num1 + num2 + num3 + num;
        ls.push_back(total);
    }
    ls.remove_if([](int i) {return i >=5000; });//5000이상은 list에서지우기
    ls.sort();
    ls.unique();
    for (ltr = ls.begin(); ltr != ls.end(); ltr++)
    {
        notself += *ltr;
    }

    cout << number - notself;
}

2019/01/21 02:52

김상범

Numpy를 활용한 문제 풀이

내장함수로도 충분히 해결 할 수 있지만 분석업무를 하다보니 행렬연산을 할 수 있는 Numpy를 활용해봤습니다.

해당 문제는 (1부터 5000까지의 합) - (5000까지 generator 숫자의 합) 을 빼주는 방법으로 간단히 풀 수 있습니다.

genrator된 숫자는 계속 n자신을 더 해주기 때문에 n보다 작아질 수는 없습니다. 따라서, N까지 self-number를 구하기 위해서는 N까지만 generator를 구해보면 됩니다. (즉, 더 이상 N까지 구하지 않고 for문은 한 번만 쓰면 됩니다.)

Python 코드

import numpy as np

num = np.array(range(1,5001)) #5000까지 합
Gen = np.array(list(set(eval('+'.join(str(i))+'+'+str(i)) for i in num))) #Generator 숫자합
#generator를 구할 때, eval과 join을 활용하면 for문 없이 각 자리수의 합을 계산할 수 있습니다.

print(sum(Gen>5000))

이때, 당연히 5000이상의 generator값들이 나오게 되는데 이는 문제범위가 아니므로 제거해줘야합니다. 여기서는 5천 이상의 generator가 24개 발생하는 것을 알 수 있습니다.

print(sum(num)-sum(Gen[Gen<=5000]))

결과로 1227365가 나오는 것을 확인 할 수 있습니다.


본 문제에서 앞으로 응용가능한 부분은 다음과 같습니다.

  1. 문자열, 수식화 후 연산
  2. 행렬연산

2019/01/22 13:35

yuong pyo lee

def d(num):
    result = num
    while num > 0:
        result += num % 10
        num = num // 10
    return result

set1 = set()
set2 = set()

for i in range(1,5000):
    set1.add(i)
    set2.add(d(i))

print(sum(set1 - set2))

2019/01/23 12:03

D.H.

$arr = array();
for($i=1; $i<5000; $i++){
    $tmp = $i + "";
    $tmp_sum = 0;
    for($j=0; $j<strlen($tmp); $j++){
        $tmp_sum += substr($tmp, $j, 1);
    }
    $tmp_sum += $i;
    if($tmp_sum < 5000)  $arr[$tmp_sum] = $i;
}

$res = 0;
for($i=1; $i<5000; $i++)  if(!isset($arr[$i])) $res += $i;

print_r($res);

2019/01/25 12:50

김태우

public class NexonGen {
    static int resultGen = 0;

    public static void main(String[] args) {
        NexonGen.calcGen();
        NexonGen.printResult();
    }

    public static void calcGen() {
        int[] judgeGen = new int [5000];
        for(int i = 0; i < 5000; i++) {
            judgeGen[i] = 0;
        }
        for(int i = 0; i < 5000; i++) { //Self-Number judge process
            int reduceCalcProcess = NexonGen.Generator(i);
            boolean overGenerator = reduceCalcProcess < 5000;
            if(overGenerator) {
                judgeGen[reduceCalcProcess]++;
            }
        }
        for(int i = 0; i < 5000; i++) { //Self-Number sum process
            if(judgeGen[i] == 0) {
                resultGen += i;
            }
        }
    }

    public static int Generator(int num) { //Generator calc process
        int result;
        int first = (num / 1000) % 10;
        int second = (num / 100) % 10;
        int third = (num / 10) % 10;
        int fourth = (num / 1) % 10;
        result = first + second + third + fourth + num;
        return result;
    }

    public static void printResult() {
        System.out.printf("Self-Number Sum(from 1 to 5000): %d", resultGen);
    }

}

2019/01/27 16:45

이재현

array=[]#제너레이터들의 합을 모은 배열

sum=0
for i in range(1,4980):#숫자 튜플로받고 조인한다음 스플릿 그다음 더하고 어펜
            k=str(i)
            o=",".join(k)
            g=o.split(',')
            sum1=0
            for b in g:
                 sum1+=int(b)
            sum1+=i
            array.append(sum1)

for a in range(1,5000):
      if array.count(a)==0:
            sum+=a
      else:
            pass
print(sum)

2019/01/28 19:58

이상승

#include<stdio.h>

int main(){

    int cnt[5454]={};
    int res=0;
    for(int i=1;i<=5000;i++){
        int non_self=i,j=i;
        while(j){
            non_self+=j%10;
            j/=10;
        }
        cnt[non_self]=1;
    }
    for(int i=1;i<=5000;i++){
        if(!cnt[i]) res+=i;
    }
    printf("%d",res);
    return 0;
}

2019/01/29 15:52

장미

def SelfNumber(start,end):
    lis=[]
    for i in range(start,end+1):
        lis.append(i//10+i%10+i)

    return sum(set(list(range(start,end+1)))-set(lis))


print(SelfNumber(1,5000))

2019/01/30 00:58

얀차

멀고도 험한 파이쏘닉의 길

def HasGenerator(n):
    trial = len(n)
    n = int(n)
    gen = 0;

    for i in range(1, n, 1):
        gen = i
        for j in range(0, trial, 1):
            gen += (i % 10)
            i //= 10
        if (gen == n):
            return True

    return False

selfNumSum = 0
integerLim = 5000
selfNumCheck = list()

# Self Number Check
# print(HasGenerator(str(10)))

for i in range(1, integerLim, 1):
    if (HasGenerator(str(i)) == False):
        selfNumSum += i
        selfNumCheck.append(i)

print("Result: ", selfNumSum, selfNumCheck)

2019/01/31 15:17

ChungGeol You

#include <stdio.h>

int main(void)
{
    int i;
    int total = 0;
    int bool = 1;
    int a, b, c, d;

    for (i = 1; i < 5000; i++)
    {
        bool = 1; //i가 셀프 넘버라고 가정

        for (a = 0; a < 5; a++)
        {
            for (b = 0; b < 10; b++)
            {
                for (c = 0; c < 10; c++)
                {
                    for (d = 0; d < 10; d++)
                    {
                        if (i == 1001 * a + 101 * b + 11 * c + 2 * d) //i가 셀프 넘버가 아닐 조건
                        {
                            bool = 0; //i가 셀프 넘버가 아님
                            break;
                        }
                    }
                    if (d == 10) d = 9;
                    if (i == 1001 * a + 101 * b + 11 * c + 2 * d) break;
                }
                if (c == 10) c = 9;
                if (i == 1001 * a + 101 * b + 11 * c + 2 * d) break;
            }
            if (b == 10) b = 9;
            if (i == 1001 * a + 101 * b + 11 * c + 2 * d) break;
        }               

        if (bool == 1) total += i; //셀프 넘버 합
    }
    printf("%d", total);
    return 0;
}

1000의 자리 수가 a, 100의 자리 수가 b, 10의 자리 수가 c, 1의 자리 수가 d인 수가 제너레이터라면 d(n)==1001a+101b+11c+2d이므로 i가 1001a+101b+11c+2d의 꼴로 표현이 되면 셀프 넘버가 아님을 이용함

이렇게 무식하게 풀 수도 있습니다 여러분
(요소 5000개짜리 배열선언해서 푸는건 공간낭비라고 생각했지만 막상 따져보니 20kb밖에 안되네요;)

2019/01/31 20:30

김태헌

파이썬 3.6.8버전으로 작성함

def d(n):
    str_n = str(n)
    sum = 0
    for i in range(len(str_n)):
        sum += int(str_n[i])
    sum += n
    return sum

def selfnumber():
    range_list = [i for i in range(1, 5000)]
    result = []
    result_list = []
    for i in range_list:
        result_list.append(d(i))
    for i in range_list:
        if not i in result_list:
            result += i
    print(result)

2019/02/01 00:26

조유빈

[Python] 제너레이터를 가진 숫자들을 리스트화한 후 셀프넘버를 추출하는 코드

def func(n):
    gene_number = []
    result = 0
    i = 0

    while result + i < n:
        i += 1
        for j in range(len(f"{i}")):
            result += int("".join(f"{i}")[j])

        gene_number.append(result + i)
        result = 0

    self_number = [x for x in range(n) if x not in gene_number]

    return sum(self_number)
print(func(5000))
1227365

2019/02/01 05:20

x monciel

include

using namespace std;

int SelfNumAdd(int num);

int SelfNumAdd(int num){ return (num + num / 1000 + (num % 1000) / 100 + (num % 100) / 10 + num % 10); }

int main(void){ int num1[5000]; int havenum[5000] = { 0, }; int count = 0;

for (int i = 1; i <= 5000; i++){
    num1[i-1] = SelfNumAdd(i);
}

for (int i = 0; i < 5000; i++){
    if (num1[i] <= 5000){
        havenum[num1[i] - 1] = num1[i];
    }
}


for (int i = 0; i < 5000; i++){
    if (havenum[i] == 0){
        count = count + 1;
    }
}

cout << count << endl;
return 0;

}

2019/02/03 10:35

박태준

#1. 제너레이터를 만드는 함수를 설정한다.
def gener(n):
    n = str(n)
    ssum = 0
    for i in range(len(n)):
        ssum += int(n[i])
    return ssum + int(n)

#2. 1~5000 사이 수의 제너레이터들의 집합을 구한다.
c = set()
for i in range(1,5000):
    c.add(gener(i))

#3. 1~5000 사이 수 중 제너레이터 집합에 속하지 않는 요소들을 합한다.    
ssum = 0
for i in range(1,5000):
    if i not in c:
        ssum += i
print(ssum)

Answer : 1227365

2019/02/06 22:20

dodoman

package problem01;


public class solution {
    public static int self_number(int n) {
        int d=n;


        while(n>0) {
            d+=n%10;
            n=(n-(n%10))/10;        
        }
        return d;   
    }

    /* 코드 구현방법
     * 배열 arr에 1~5000까지 제너레이터를 다 모은 다음,
     * 첫 for구문에서 i=1이 배열과 모두 다 비교해서 i가
     * arr에 없다면 sum에 더하고(40번째 if문) 만약 잇다면 그냥 지나가는 
     * 방법으로 셀프 넘버를 하나씩 다 구하였다. 
     */

    public static void main(String[] args) {
        int sum=0;
        int[] arr = new int[5000];
        for(int i=0; i<5000; i++ ) {  
            arr[i]=self_number(i+1);
        }

        for(int i=1; i<=5000; i++) {
            int count=0;
            while(count<=4999) {
                if(self_number(count)!=i) {
                    count++;
                }
                else {
                    break;
                }
            }
            if(count>4999) {
                System.out.println(i);
                sum += i;
            }

        }
        System.out.println(sum);
    }

}

구현 방법은 코드 중간에 주석으로 처리 하였습니다.

2019/02/07 22:31

유견

public class Generator {
    public static void main(String[] args){
        int sum = 0;

        for(int s = 1;s<5000;s++){
            for(int i = 0;i<s;i++){ //i>=s이면 i가 제네레이터가 될수없음.
                if(s == (i/1000) + ((i/100)%10) + ((i/10)%10) + (i%10) + i){
                    break;//제네레이터 발견시 즉시 다음 s값 판단.
                } else {
                    if(i == s-1){    //i가 s에 다다를 때까지 제네레이터를 발견못한다면 s는 self-number로 판단.
                        sum +=s;
                        System.out.println(s);
                    }
                }
            }

        }

        System.out.println(sum);

    }
}

2019/02/07 22:53

김동수

resultlist = list(range(1, 5000))                ##결과 리스트 사전 할당 (1~4999)

for i in range(1, 5000):                          ## 1~4999까지 각 수별로 확인
    tmp = i                                         ## 확인중인 i 값 임시 저장
    result = i                                       ## 덧셈결과 값을 자신의 값인 i 를 초기값으로

    while(tmp != 0):                              ## 나머지가 0이 되는 경우까지 반복
        result += tmp%10                       ## 덧셈 결과값에 1의 자리 숫자를 더하기
        tmp = int(tmp/10)                       ## 1의 자리수 제외한 수로 tmp 값을 변경      

    if result in resultlist:                          ## 덧셈 결과 값이 결과 리스트에 있는 경우
        resultlist.pop(resultlist.index(result))  ## 해당되는 값을 결과리스트에서 제외

print(sum(resultlist))                              ## 총합 출력

2019/02/08 17:20

meerguin

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

int getGen(int num) {
    if (num == 0) return 0;
    int tmp = num;
    int sum = 0;
    while (true) {
        sum += tmp % 10;
        tmp /= 10;
        if (tmp == 0) break;
    }
    return sum + num;
}

int main() {
    int sum = 0;
    int idx;
    int arr[5001];
    for (int i = 0; i < 5001; i++) {
        arr[i] = 0;
    }
    for (int i = 1; i <= 5000; i++) {
        idx = getGen(i);
        if (idx > 5000) continue;
        arr[idx]++;
    }
    for (int i = 1; i <= 5000; i++) {
        if (arr[i] == 0) sum += i;
    }
    printf("%d\n", sum);
    return 0;
}

2019/02/11 16:59

JohnSuhr

public class main {

    public static int Solution(int n) {
        int result = 0;

        boolean[] check = new boolean[n+1];

        for(int i = 1; i <= n; i++) {
            if(isGenerator(i) < 5001) {
                check[isGenerator(i)] = true;
            }
        }

        for(int i = 1; i <= n; i++) {
            if(!check[i]) {
                result += i;
            }
        }
        return result;
    }

    public static int isGenerator(int n) {  
        int result = n;

        while(n > 0) {
            result += n%10;
            n /= 10;
        }
        return result;
    }


    public static void main(String[] args) {
        int n = 5000;
        System.out.println(Solution(n));
    }

}

2019/02/13 09:52

김세준

include

int SelfNumber(int num) { //셀프넘버 구하는 함수 int sum = 0; sum += num; for (; num != 0;) { sum += (num % 10); num /= 10; } return sum; }

void main(){ int arr[5000]; int i, j; for (i = 0; i < 5000; i++) { // 1~5000까지의 셀프넘버 arr[i] = SelfNumber(i + 1); }

for (i =1; i <= 5000; i++) {
    for (j = 0; j < 5000; j++) {//1~5000 (i)까지 셀프넘버 집합안의 수(arr[j])와 동일한 수가 있는지 확인
        if (i == arr[j]) {
            break; //같은 경우가 있을 경우, 비교를 종료 후, 다음 수(i++)와 비교
        }
    }
    if (j == 5000) {// j가 5000까지 도달한 경우 = i 는 셀프넘버 수와 일치하는 수가 아니다 = 셀프넘버가 아닌 i 출력
        printf("%d  ", i);
    }
}

}

2019/02/14 14:47

정유석

notself =set()
for a in range (5):
    num = 0
    num += 1001*a
    for b in range (10):
        num += 101*b
        for c in range (10):
            num += 11*c
            for d in range (10):
                num += 2*d
                notself = notself | {num}

self = {i for i in range(1, 5000)} - notself
self = list(self)
sum = 0
for i in self:
    sum += i

print(sum)

한 자릿수 d-> 2d 두 자릿수 10c + d -> c + d + 10c + d = 11c + 2d 세 자릿수 100b + 10c + d -> b + c + d + 100b + 10c + d = 101b + 11c + 2d 네 자릿수 1000a + 100b + 10c + d -> a + b + c + d + 1000a + 100b + 10c + d = 1001a + 101b + 11c + 2d (a<=4)

2019/02/15 13:28

Jeong Sanghyun

list1 = []

for i in range(1,5000+1): 
    sum = 0
    sum2 = 0
    for j in range(len(str(i))):
        sum2 = sum2 + int(str(i)[j])
    sum = i + sum2
    list1.append(sum)

list2 = []
for x in range(1, 5000+1):
    if x not in list1: 
        list2.append(x)

print(list2)

2019/02/15 14:24

Sang Brian

def nexon(a,b):
    generator = []
    total_number = []
    generator_elements = 0
    for number in range(a,b):
        total_number.append(number)
        number_list = list(str(number))
        for number_count in range(len(number_list)):
            generator_elements += int(number_list[number_count])
        generator_elements += number
        generator.append(generator_elements)
        generator_elements = 0
    set_generator = set(generator)
    set_total_number = set(total_number)
    self_number = set_total_number - set_generator
    self_number_list = list(self_number)
    print(sum(self_number_list))

nexon(1,5000)

2019/02/15 14:24

김상민



# 제너레이터 추출
def geneNumber(n): 
    decomp = n
    decomp_total=0
    for i in str(decomp):
        decomp_total += int(i)

    decomp_total +=n

    return decomp_total



#셀프숫자가 아닌 숫자의 조합으로 참조 배열 만들기
ref_array = []
for i in range(5000):
    ref_array.append(geneNumber(i))

# 참조배열과 비교하여 중복이 없는 값만 더하기
sum_num = 0
for i in range(5000):

    if i not in ref_array:
        sum_num +=i


print(sum_num)

2019/02/16 02:05

전재웅

fbox =set()
tbox = set()

def filter():
    for i in range(1,5001):
        st = str(i)
        sum = eval("+".join(st))+i
        fbox.add(sum)
        tbox.add(i)
def dset():
    di = tbox.difference(fbox)
    dilist = sum(list(di))
    return dilist
filter()
gmk = dset()
print(gmk)


#코딩도장 답
print(sum(set(range(1, 5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)}))

2019/02/16 16:55

김규묭

// ConsoleApplication1.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

int dn(int i);
int main()
{
    static int d[5001];//0으로 채워짐
    int sum = 0;

    for (int i = 1; i <= 5000; i++)
    {
        d[dn(i)] = 1;

        if (d[i] == 0)
            sum += i;
    }
    return 0;
}

int dn(int i)
{
    int result = i;

    if (i >= 1000) { result += i / 1000; i %= 1000; };
    if (i >= 100) { result += i / 100; i %= 100; };
    if (i >= 10) { result += i / 10; i %= 10; };

    return result += i;
}

2019/02/16 19:37

박성은

num_set = set(range(5000))
gene=0
gene_set=set()
for i in range(5000):
    for j in str(i):
        gene+=int(j)
    gene+=i
    gene_set.add(gene)
    gene=0

print(sum(num_set - gene_set))

2019/02/18 09:06

nonSelfNum = []
totalRange = [x for x in range(1, 5000)]
for gen in totalRange :
    jarisu = 0
    nonSelfNum.append(gen + sum(int(j) for j in str(gen)))
result = set(totalRange) - set(nonSelfNum)
print(sum(result))

2019/02/18 14:21

좋은나쎔

#include <stdio.h>

//d(n)을 구하는 함수
int d(int i) {
    int a, b, c, d;
    a = i / 1000;
    b = (i - a * 1000)/100;
    c = (i - a * 1000 - b * 100)/10;
    d = i - a * 1000 - b * 100 - c * 10;
    if (i >= 1000) {
        return a + b + c + d + i;
    }
    else if (i >= 100) {
        return b + c + d + i;
    }
    else if (i >= 10) {
        return c + d + i;
    }
    else {
        return d + i;
    }
}

//구한 모든 d(n)을 정렬하는 함수
int sort(int ary[], int n) {
    int i, j;
    int temp;

    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < (n - i); j++) {
            if (ary[j] > ary[j + 1]) {
                temp = ary[j];
                ary[j] = ary[j + 1];
                ary[j + 1] = temp;
            }
        }
    }
}

int main(void) {
    int ary[5000];
    int temp;
    int count;
    int i;
    int sum = 0;

    //d(n)을 구해서 배열에 저장(1<=n<=5000, d(n)>5000인 경우는 필요 없으므로)
    for (i = 1; i <= 5000; i++) {
        ary[i - 1] = d(i);
    }

    sort(ary, sizeof(ary) / sizeof(int) - 1);

    temp = ary[0];
    count = ary[0];

    //5000이하의 d(n)을 중복없이 모두 더하는 반복문, temp을 이용해 이전 배열값과 다른 경우에만 더함.
    for (i = 0; i < 5000; i++) {
        if (ary[i] > 5000) {
            break;
        }
        else {
            if (temp != ary[i]) {
                temp = ary[i];
                count += ary[i];
            }
        }
    }


    //1부터 5000까지의 합을 구함
    for (int i = 1; i <= 5000; i++) {
        sum += i;
    }

    //1부터 5000까지의 합에서 중복을 제거한 모든 d(n)값(1<=d(n)<=5000)의 합을 뺀다.
    //그러면 셀프 넘버 합이 나온다.
    printf("%d",sum - count);
}

2019/02/19 19:23

kpu

sum=0
s=[]
for i in range(1,5000): s.append(i)
for i in range(1,5000):
    m=i
    m+=i//1000
    i=i%1000
    m+=i//100
    i=i%100
    m+=i//10
    i=i%10
    m+=i
    while(m in s):
        s.remove(m)
for i in range(len(s)):
    sum+=s[i]
print(sum)

2019/02/20 18:19

김지수

   class Program
    {
        static void Main()
        {
            Console.WriteLine(GetSumOfGen(1, 5000));
            Console.ReadKey(true);
        }

        static int GetSumOfGen(int start, int end)
        {
            return Enumerable.Range(start, end).ToArray()
                .Where(x => IsGenNum(x)).Sum();
        }

        static bool IsGenNum(int num)
        {
            //First Get Max Gen Value

            int max_gen_val = 0;

            string str_num = num.ToString();

            int digit = str_num.Length;

            max_gen_val = num - 9 * digit;

            if (max_gen_val < 0)
                max_gen_val = 0;

            //Loop From Max Gen Value

            for (int i = max_gen_val; i < num; i++)
            {
                str_num = i.ToString();

                int val = i;

                for (int j = 0; j < str_num.Length; j++)
                {
                    val += Convert.ToInt32(str_num[j].ToString());
                }

                if (val == num)
                    return false;
            }

            return true;
        }
    }

2019/02/23 16:19

이기현

#include <stdio.h>

int generate(int);

int main() {
    int num[5000];
    int have_g[5000] = { 0, };
    int sum = 0;

    for (int i = 1; i <= 5000; i++)
        num[i - 1] = generate(i);

    for (int i = 0; i < 5000; i++) {
        if (num[i] <= 5000)
            have_g[num[i]-1] = 1;
    }

    for (int i = 0; i < 5000; i++) {
        if (have_g[i] == 0)
            sum += i+1;
    }

    printf("%d\n", sum);
}

int generate(int x) {
    return x + (x / 1000) + (x % 1000) / 100 + (x % 100) / 10 + x % 10;
}

2019/02/25 22:37

황정인

def d(n):
    digitsum=0
    for i in str(n):
        digitsum+=int(i)
    return digitsum+n


self=list(range(1,5001))
for i in range(1,5001):
    if d(i) in self: self.remove(d(i))

print(sum(self))



2019/02/27 10:01

ykleeac

1) R코딩 - strsplit을 위해 문자형으로 변환 - sapply를 사용하지 않아봄

n<-c(1:5000)
k<-NULL

for(i in 1:length(n)){
  k<-append(k,sum(as.integer(unlist(strsplit(as.character(n[i]),'')))))
}

answer<-sum(setdiff(n,(n+k)))
answer

2) PYTHONE코딩 - 다른 분것 참고 함

d_n=[]
for i in range(1,5000):
    num=i
    strnum=str(i)
    for j in range(0,len(strnum)):
        num=num+int(strnum[j])
    d_n.append(num)

ls=list(range(1,5000))
type(d_n[1])

d_n_sum=0
for i in range(1,5000):
    if i not in d_n:
        d_n_sum+=i
d_n_sum

2019/02/28 13:35

원대훈

def d(n):
    n2str = str(n)
    nums = [int(num) for num in n2str]
    return sum(nums) + n

def selfnumsum(maxn):
    gens = []
    for i in range(1, maxn):
        gen = d(i)
        gens.append(gen)
    gens = list(set(gens))
    gens.sort()
    gens_ = [num for num in gens if num < maxn]
    nums = [num for num in range(1, maxn)]
    for i in range(len(gens_)):
        if nums.count(gens_[i]):
            nums.remove(gens_[i])
    return sum(nums)

print(selfnumsum(5000))

2019/03/07 00:14

권준형

a= set(range(1,5000))
b=list()
for x in range(1,5000) :
   for k in str(x) :
      x+=int(k)
   b.append(x)
print(sum(a-set(b)))

출력값 : 1227365

셀프 넘버 값을 // 값으로 나눠서 더하는 방법도 있는 거 같은데, 생각보다 식이 난잡해 지고 복잡해 져서 str 화 해서 하는게 제일 간단 하더군요

2019/03/07 17:18

Maro K

temp_list=[]
temp_set=set()
for i in range(1,5000+1):
    temp=str(i)
    sum1=0
    for j in temp:
        sum1+=int(j)
    res=sum1+i
    temp_list.append(res)
    temp_set=set(temp_list)

sum2=0
for i in range(1,5000+1):
    if i not in temp_set:
        sum2+=+i
print(sum2)



2019/03/11 23:09

전준영

def d(n):
    lst = [i for i in str(n)]
    lst.append(n)
    return sum(list(map(int, lst)))
gn= [d(i) for i in range(5000)]
sum([i for i in range(5001) if i not in gn])

2019/03/15 17:46

김동률

gen = []

nums = range(1,5001)

for i in range(1, 5001): gen.append(sum(int(a) for a in str(i)) + i)

print(sum(set(nums) - set(gen)))

2019/03/21 17:21

김성근

def d(number):
    total = number
    number = str(number)
    for i in number:
        total += int(i)
    return total

print(sum(set(range(1,5000)) - set([d(i) for i in range(1,5000)])))

2019/03/22 19:39

SungJin Lee


public class question01 {
    public static void main(String[] args) {
        boolean[] isNotSelfNumber = new boolean[5001];
        int sum = 0;
        for (int i = 1; i <= 5000; ++i) {
            int dn = getDn(i);
            if (dn <= 5000) {
                isNotSelfNumber[dn] = true;             
            }
        }

        for (int i = 1; i < isNotSelfNumber.length; ++i) {
            if (!isNotSelfNumber[i]) {
                sum+=i;             
            }
        }
        System.out.println(sum);
    }

    private static int getDn(int n) {
        int dn = n;
        while(n > 0) {
            dn += n % 10;
            n /= 10;
        }
        return dn;
    }
}

2019/03/30 18:45

조재현

def generator(n):
    n02=str(n)
    a=0
    for i in range(len(n02)):
        a+=int(n02[i])
    a+=n
    return a

def solution(n):
    a=False
    for i in range(n+1):
        if generator(i)==n:
            a=True
            break
    return a

n=0
for i in range(5001):
    if solution(i) is False:
        n+=i
print(n)

정답1227365

2019/04/03 01:16

hoseipark

def d(n): #generator
    return n + sum(map(int, list(str(n))))

def sum_of_self_numbers(n): #n미만의 셀프 넘버들의 합
    return sum(set(range(1,n)) - set(map(d, range(1, n))))


print(sum_of_self_numbers(5000))

2019/04/03 06:25

messi

include

void main(){ int sum = 0; for (int i = 1; i <= 5000; i++){ for (int j = 1; j <= 5000; j++){ if (i == generator(j)){ break; } else if (j == 5000){ sum += i; } } } printf("%d\n", sum);

} int generator(int num){ int g; if (num < 10){ g = num + num; } else if (num<100){ g = num / 10 + num % 10 + num; } else if (num<1000){ g = num / 10 / 10 + num / 10 % 10 + num % 10 + num; } else{ g = num / 10 / 10 / 10 + num / 10 / 10 % 10 + num / 10 % 10 + num % 10 + num; } return g; }

2019/04/08 18:55

이준성

class Study
{   
    public static void main(String[] args)
    {
        int a, b, c, d, result;
        int total=0;
        boolean[] arr = new boolean[5000];
        System.out.println(total);
        for(int num=1; num<5000; num++) {
            a = num/1000;
            b = (num/100)%10;
            c = (num/10)%10;
            d = num%10;
            result = a+b+c+d+num;

            if((result>=1) && (result<5000))
                arr[result] = true;

        }

        for(int i=1; i<5000; i++)
            if(arr[i] != true) {
                total = total + i;
                System.out.println("TEST00  " + total);
            }

        System.out.println(total);
    }

}

2019/04/10 17:46

Dopot

numList=[]
genList=[]
selfList=[]
res=0
for i in range(1,5000):
    numList.append(i)

for num in numList:
    num=str(num)
    depth = len(num)
    sum = int(num)
    for i in range(depth):
        sum += int(num[i])
    genList.append(sum)

for i in range(1,5000):
    if i not in genList:
        selfList.append(i)

for i in selfList:
    res += i
print("합:",res)

2019/04/11 14:29

Chang Hwan Kim

def d(n):
    sum = 0
    for digit in str(n):
        sum += int(digit)
    return sum+n

selfset = set(range(1,5001))

for num in range(1,5000):
    if d(num) in selfset:
        selfset -= {d(num)}

print(sum(selfset))

2019/04/16 16:01

Wonjin Park

snc = 4            #self_number_count
lsn = 9            #last_self_number
i = 11             #interval
while(lsn < 5000):
    for i in range(9):
        lsn += i
        snc += 1
    i = (i - 1) * 10 + 1
print(snc)

셀프 넘버의 규칙성을 생각해보니 10이상일 경우 간격이 11, 101, 1001, 10001 . . . 씩 9번 반복되어 나오기 때문에 간격을 더해 바로 다음 셀프 넘버를 구해준 뒤 셀프 넘버의 갯수를 1만큼 늘려주는 위와 같은 코드를 작성했습니다.

한자리일 경우 위의 규칙성과 달라 셀프 넘버 1, 3, 5, 7, 9 이 5개를 위해 조건문을 넣는 것은 비효율적이어서 last_self_number에 9를 넣어주고 self_number_count를 5만큼 늘려야합니다.

또한 위의 while문의 경우 5000이상인 셀프 넘버까지 한번 넘어가기 때문에 self_number_count를 한번 빼줘야 해서 self_number_count에 4를 대입해주었습니다.

2019/04/19 23:26

으이하늘

c

#include <stdio.h>
int generator(int a);
int main() {
    int num[6000] = { 0, }, sum = 0;
    for (int i = 1; i <= 5000; i++) {
        num[generator(i)]++;
    }
    for (int i = 1; i <= 5000; i++) {
        if (num[i] == 0) {
            sum += i;
        }
    }
    printf("셀프넘버의 합 : %d\n", sum);
}
int generator(int a) {
    int num = a, sum = 0, digit = 0;
    sum += a;
    while (1) {
        digit = num % 10;
        sum += digit;
        if (num >= 10) {
            num /= 10;
        }
        else
            break;
    }
    return sum;
}

2019/04/25 14:26

용 빈

ㅋㅋ 이런 사이트를 이제 알고.. 지금부터 1일 1코딩 시작해봅니다.

저는 우선 비교대상의 dataset을 만들고 지정한 범위 내의 값이 해당 dataset에 존재하는지 여부를 확인하여 add하는 로직으로 구현하였습니다.

def compute(gen):
    result = 0
    for i in str(gen):
        result += int(i)
    result += gen

    return result

def find_self_number(max):
    compare_data = set()
    for i in range(max):
        data = compute(i)
        if data > max:
            break
        compare_data.add(data)

    result = 0
    for n in range(5000):
        if n not in compare_data:
            result += n

    return result

if __name__ == "__main__":
    print(find_self_number(5000))

2019/04/26 11:32

Jaeman Lee

def d(n): jarisu=[] m=n

while m:    
    jarisu.append(m%10)
    m=int(m/10)

return sum(jarisu)+n

gen_num=set() self=set()

for i in range(5001): gen_num.add(d(i))

self=set(range(5001))-gen_num

print(sum(self))

2019/04/30 11:13

암살자까마귀

result = []
for idx in range(1,5000):
    if idx >= 1 and idx < 10:
        result.append(idx*2)
    elif idx < 100:
        result.append(idx//10 + idx%10 + idx)
    elif idx < 1000 :
        a = idx // 100
        b = (idx % 100) // 10
        c = (idx % 100) % 10
        result.append(a+b+c+idx)
    elif idx < 5000 :
        a = idx // 1000
        b = (idx % 1000) // 100
        c = (idx % 100) // 10
        d = idx % 10
        result.append(a+b+c+d+idx)

answer = sum(set(range(1,5000)) - set(result)))

결과 : 1127365

2019/04/30 19:11

JLetter

시간복잡도 O(N)

#include <iostream>
#include <cstring>
using namespace std;
bool isVisited[5001];
void generator(int N)
{
    for(int i = 1; i <= N ; i++)
    {
        int gen_num = i;
        for(int j = 1; i / j > 0 ; j *=10)
        {
            gen_num += i / j % 10;
        }
        if(gen_num > N)
            continue;
        isVisited[gen_num] = true;
    }

}


int main(void)
{

    memset(isVisited, false, sizeof(bool)* 5001);
    generator(5000);
    int sum = 0;
    for (int i = 1; i <= 5000; i++) {
        if(!isVisited[i])
            sum += i;
    }
    cout << sum <<endl;
    return 0;
}


2019/05/01 13:27

이기준

오늘 가입한 코딩 왕초보 입니다.. 숫자를 스트링 변환후 쪼개어 자리수만큼 리스트에 넣고 더한값을 다시 리스트에 넣고 셋으로 변환한 차집합의 합을 구했습니다.무식하게 한것 같은데 답은 나오네요...^^

lst1,lst2=range(1,5001),[]
def gen(x):
    j = 0
    y = list(str(x))
    for i in y:
        j += int(i)
    j += x
    return j
for i in range(1,5001):
    lst2.append(int(gen(i)))
st1 = set(lst1)-set(lst2)
print(sum(st1))

2019/05/10 02:26

김영준

#ver3.7

alpha = 5000  ##input

def gene(num):
    for i in str(num):
        num = num + int(i)
    return num

list = set(range(1,alpha))

check = set([])
for i in range(1,alpha):
    check.add(gene(i))

print(sum(list-check))

최대값을 지정할 수 있도록 코딩했습니다

2019/05/15 03:00

_styl2s

#include <stdio.h>

int isSelfNum(int number);
int generator(int series);

void main(){

    int starter = 1;
    int sumSelfNum = 0;

    for(starter;starter<=5000;starter++){
        sumSelfNum = sumSelfNum + isSelfNum(starter);
    }
    printf("%d",sumSelfNum);
}

int generator(int number){

    int temp;
    int digitSum=0;

    temp = number;

    while(number>0){
        digitSum = digitSum + (number%10);
        number = number/10; 
    }

    digitSum = digitSum + temp;

    return digitSum;
}

int isSelfNum(int number){

    int i;

    for(i=0;i<number;i++){
        if(generator(i) == number){
            return 0;
        }
    }
    return number;
}

2019/05/16 18:26

Wonsang Kim

n = set(range(1,5000))
m = 0

for i in range(1,5000):
    m = i
    for ii in str(i):
        m += int(ii)
    n -= {m}

print(sum(n))

2019/05/16 23:01

tigermap

#generator 함수
def generator(number):
    str_number = str(number)
    my_number = 0
    for i in range(len(str_number)):
        my_number += int(str_number[i])

    final_number = my_number + number
    return final_number

#self_number 찾기
def self_number(number):

    #범위 내에서 셀프넘버가 아닌 값들을 리스트로 묶음
    noself_number_list =[]
    self_number_sum = 0         #셀프 넘버들의 합의 초기값

    #셀프 넘버가 아닌 값들 리스트 생성
    for i in range(1,number):
        noself_number_list.append(generator(i))

    #전체 자연수 - 셀프넘버가 아닌 자연수 = 셀프넘버인 자연수
    for j in range(1, number):
        if j not in noself_number_list:
            self_number_sum += j

    return self_number_sum

print(self_number(5000))

2019/05/19 17:00

jinoh

파이썬 3.7.2

def d(n):
    s = 0
    for x in str(n):
        s += int(x)
    s += n
    return s
def generator(n):
    gen = []
    for x in range(n):
        if d(x) == n:
            gen.append(x)
    return gen
self = []
for x in range(1, 5000):
    if generator(x) == []:
        self.append(x)
print(sum(self))

답 : 1227365

2019/05/22 18:54

CT_EK

#include <iostream>


int myGenerator(int a)
{
    int sum = 0;
    int units = 0;
    int tens = 0;
    int hundreds = 0;
    int thousands = 0;

    if (a < 10) // 1~9
    {
        sum = a + a;
    }
    else if (a < 100 && a > 9) // 10~99
    {
        units = a % 10;
        tens = a / 10;
        sum = units + tens + a;

    }
    else if (a < 1000 && a > 99) // 100 ~ 999
    {
        hundreds = a / 100;

        tens = a / 10;
        tens = tens % 10;

        units = a % 10; 
        sum = hundreds + tens + units + a;
    }
    else if (a <= 5000 && a > 999) // 1000 ~ 5000
    {
        thousands = a / 1000;
        //std::cout << thousands << std::endl;

        hundreds = a / 100;
        hundreds = hundreds % 10;
        //std::cout << hundreds << std::endl;

        tens = a / 10;
        tens = tens % 10;
        //std::cout << tens << std::endl;

        units = a % 10;
        //std::cout << units << std::endl;
        sum = thousands + hundreds + tens + units + a;
    }
    return sum;
}


int main()
{
    int num = 0;
    int arr[5001] = { 0 };
    for (int i = 1; i < 5001; ++i)
    {
        num = myGenerator(i);
        if(num < 5001)
        arr[num] = 1;
    }
    int sum = 0;
    for (int i = 1; i < 5001; ++i)
    {
        if (arr[i] == 0)
            sum += i;
    }
    std::cout << sum << std::endl;
}

2019/05/22 20:17

박인혁

k=range(1,5000)
box=[]
def A():
    a=range(1,5000)
    for number in a:
        for x in k:
            i=str(x)
            if len(i)==1:
                a=int(i[0])
                if a+x==number:
                    box.append(number)
            elif len(i)==2:
                a=int(i[0])
                b=int(i[1])
                if a+b+x==number:
                    box.append(number)
            elif len(i)==3:
                a=int(i[0])
                b=int(i[1])
                c=int(i[2])
                if a+b+c+x==number:
                    box.append(number)
            elif len(i)==4:
                a=int(i[0])
                b=int(i[1])
                c=int(i[2])
                d=int(i[3])
                if a+b+c+d+x==number:
                    box.append(number)
A()
q=list(set((box)))
w=sum(q)
e=sum(range(0,5000))
print(e-w)

1227365 코린이입니다. 짧은 문법으로 풀려니 힘드네요...

2019/05/26 18:24

임희동

def D(num):
    return num + sum(int(x) for x in str(num))

def run():
    print(sum(set(range(1, 5000)) - set(D(x) for x in range(1, 5000))))

if __name__ == '__main__':
    run()

집합 자료형 왜 쓰나 했더니 중복 때문이었군요. 틀린 줄도 모르고 바로 풀이 봐버렸다..

2019/05/27 14:53

이진형

include

int generator(int n) { int ret = n; while (n) { ret += n % 10; n /= 10; } return ret; } int main() { int n[5001] = { 0, }, res = 0; for (int i = 1; i <= 5000; ++i) { int g = genorator(i) if (g <= 5000) n[g] = 1; } for (int i = 1; i <= 5000; ++i) { if (!n[i]) { res += i; } } printf("%d", res); return 0; }

2019/05/31 12:34

송재현

def d_fn(n):
    y = n
    while n > 0:
        y += n % 10
        n //= 10
    return y

Z = [d_fn(n) for n in range(5000)]
A = [n for n in range(5000) if n not in Z]
print (sum(A))

2019/06/05 12:59

Mamur Djuraev

파이썬 3.7 사용.

def f_d(n): #d(n), n은 자연수
    result=n
    while(n>=1):
        result+=n%10
        n=n//10
    return result


def Non_Self_Num_sum(n): # n보다 작고 셀프 넘버가 아닌 자연수들의 리스트를 구해서 그 총합을 반환
    tmp_list=[]
    for i in range(1,n): #n>0이면 f_(n)>n 이므로 n보다 큰 수들은 f_d(i)를 계산할 필요없음.
        a=f_d(i)
        if not a in tmp_list and a<n: 
            tmp_list.append(a)

    return sum(tmp_list)

def Total_sum(n): #1부터 n까지 자연수를 모두 더한 합
    return int((1+n)*n/2)

if __name__ == '__main__':
    n=5000
    print(Total_sum(n)-Non_Self_Num_sum(n))

2019/06/06 18:21

왕초보

//c로 짯는디 그냥 보기 좋게만 짯구만유

int main() { //1~5000 사이의 셀프넘버를 구하라. //셀프넘버 = 제너레이터가 없는 숫자 //제너레이터 = 각자릿수 + 원래숫자 ex) gen(11) = 1+1+11 = 13

int ArrayOfGenerater[5000] = { -1, };
int SumOfNoGenerator = 0;

for (int i = 1; i <= 5000; i++)
{
    ArrayOfGenerater[i - 1] = (i / 1000) +
                              (i % 1000) / 100 +
                              (i % 100) / 10 +
                              (i % 10) +
                              (i);

    bool Exist = false;

    for (int j = 0; j < i; j++)
    {
        if (ArrayOfGenerater[j] == i)
        {
            Exist = true;
            break;
        }
    }

    if (Exist == false)
    {
        SumOfNoGenerator += i;
    }
}

std::cout << SumOfNoGenerator;

}

2019/06/10 14:49

aozora18

def sumnumber(x): if 1000 <= x < 10000: a = x//1000 b = (x-a1000)//100 c = (x-a1000-b100)//10 d = (x-a1000-b100-c10) x = a+ b+ c+ d return x elif 100 <= x < 1000: b = x//100 c = (x-b100)//10 d = (x-b100-c10) x = b+ c+ d return x elif 10 <= x < 100 : c = x//10 d = (x-c10) x = c+ d return x elif x < 10: return x

number = set()

for num in range(10000): x = num + sumnumber(num) number.add(x)

conclude = set(range(1,5000))-number

print(sum(conclude))

파이썬이에요 수에서 각 자리수 합구하는거에서 노가다를 햇어요 ㅜㅜ

2019/06/12 00:19

최영현

from functools import reduce

def gen_num(ge):
    g = str(ge)
    n_sum = 0
    for i in g:
        n_sum += int(i)
    n_sum += ge
    return (n_sum)

total_list = []
gen_list =[]
for se in range(1, 5001):
    total_list.append(se)
for ge in total_list:
    gen_list.append(gen_num(ge))

self_list = [q for q in total_list if q not in gen_list]
print(reduce(lambda x, y : x+y, self_list))

2019/06/17 16:27

Hwaseong Nam

package Study;

public class SelfNumber {
    public static void main(String[] args) {
        int num[] = new int[6000], sum = 0;
        for (int i = 1; i <= 5000; i++) {
            num[generator(i)]++;
        }
        for (int i = 1; i <= 5000; i++) {
            if (num[i] == 0) {
                sum += i;
            }
        }
        System.out.println("Self Number's sum is :"+sum);

    }

    static int generator(int a) {
        int num = a, sum = 0, digit = 0;
        sum += a;
        while (true) {
            digit = num % 10;
            sum += digit;
            if (num >= 10) {
                num /= 10;
            } else
                break;
        }
        return sum;
    }
}


java 답 1227365

2019/06/19 14:36

용 빈

def summation(a):
  set1= set()
  for i in range(a):
    set1.add(i+sum([int(x) for x in str(i)]))

  return sum(set(range(a))-set1)

2019/06/23 12:22

yo on

temp = [] for i in range(1, 5000): temp.append(i)

for num in range(1, 5000): num = str(num) t_sum = 0 for l in range(len(num)): t_sum += int(num[l]) t_sum += int(num) if t_sum in temp: temp.remove(t_sum)

print(sum(temp))

2019/06/23 12:24

최연석

def d(n):

    y = str(n)
    t = len(y)
    y = n
    total = 0

    while t>0:
        total += y // (10 ** (t-1))
        y = y % (10 ** (t-1))
        t -= 1
    return total + n


generators = list()
n = 1
total = 0


while(1):
    generator = d(n)
    if(generator == 5001):
        break
    generators.append(generator)
    n += 1

for i in range(1,5000):
    if(i not in generators):
        total += i

print(total)

2019/06/24 21:26

야어이구

sum_tot = 0

for i in range(1,5001): list_x = list(int(x) for x in str(i))

if int(i) != (sum(list_x) + int(i)):
    sum_tot += int(n)

print(sum_tot)

2019/06/28 15:15

SeongMin Hwang

def SelfNum(s,e):
    li=[]
    for i in range(s,e+1):
        li.append(i//10+i%10+i)

    return sum(set(list(range(s,e+1))) - set(li))


print(SelfNum(1,5000))

2019/06/30 00:25

Hyuk

def d(n) :
    result = 0; i = 0
    while n // 10**i != 0 :
        result += (n // 10**i)
        i += 1
    result += (n % 10)
    return result
answer = set(range(1, 5000)) - set(d(x) for x in range(1, 5000))
print(sum(answer))

2019/07/04 23:51

조현우

```(cpp)

include

int myfunction(int n){ return (n + n/1000 + (n%1000)/100 + (n%100)/10 + n%10); } int main(){ int arr[5000]; int arr2[5000]={0,}; int res=0; for(i=1;i<=5000;i++) arr[i-1]= myfunction(i); for(i=0;i<5000;i++){ if(arr[i] <= 5000) arr2[(arr[i] -1)]=1; } for(i=0; i<5000; i++){ if(!arr2[i]){ res += (i+1); printf("%d ", i+1); } } printf("\n답: %d\n", res); return 0; } ```

2019/07/08 00:34

coding boy

def d(num):
    strng = str(num)
    count = 0
    for k in strng:
        count += int(k)
    return count + num


num_lst = []
for i in range(1, 5000):
    cnt = 0
    for j in range(1, i+1):
        if d(j) == i:
            cnt += 1
    if cnt == 0:
        num_lst.append(i)


print(sum(num_lst), end - start)

2019/07/11 00:39

임재범

package generator;

public class generator {
    public static void main(String[] args) {
    int sum = 0;
    int result = 0;

    for (int i = 1; i <= 5000; i++)
        result += i;

    for (int i = 1; i <= 5000; i++) {
        for (int j = 1; j < i; j++) {
            if (d(j) == i) {
                sum += i;
                break;
            }
        }
    }

    System.out.println(result - sum);
    }
    public static int d(int num) {
        int result = num;

        while(num > 0)
        {
            result += num % 10;
            num /= 10;
        }
        return result;
    }
}

2019/07/11 23:13

Cattish

파이썬

rag = list(range(1,5001))
ragN = list(range(1,5001))

sum = 0
def findgen(num):
    n = ','.join(str(num))
    n = n.split(",")
    gen = 0
    for g in n:
        gen += int(g)
    gen += num
    return gen

for num in ragN:
    g = findgen(num)
    try:
        rag.remove(g)
    except ValueError:
        pass

for num in rag:
    sum += num

print(rag)
print(sum)

2019/07/12 00:29

사닐

def solution(n):
    t = []
    for i in range(1,n+1):
        i = str(i)
        s = int(i)
        for j in range(len(i)):
            s += int(i[j])
        t.append(s)

    return sum(set(range(1,n+1)) - set(t))

print(solution(5000))

2019/07/12 10:27

최은미

def d(n):
    return n + sum([int(x) for x in str(n)])

sub = [d(i) for i in range(5000)]
res = [n for n in range(5000) if n not in sub]
sum(res)

2019/07/15 22:23

Antarctic hamster

num_list = set(x for x in range(1, 5000))
have_generator = set()

for num in num_list:
    str_num = str(num)
    d_n = num
    for i in range(len(str_num)):
        d_n += int(str_num[i])
    have_generator.add(d_n)

print(sum(num_list - have_generator))

파이썬 초보입니다 차집합을 이용했습니다

2019/07/20 14:23

아 모르겠다

import java.util.*;

public class Kaprekar {

    public static void main(String[] args) {

        ArrayList<Integer> list = new ArrayList<>(); 
        ArrayList<Integer> list1 = new ArrayList<>(); 

        for(int i=0; i<5000; i++) {
            list.add(i+1);
        }

        for(int i=1; i<5000; i++) {
            int thousand = i / 1000;
            int hundred = i % 1000 / 100;
            int ten = i % 100 / 10;
            int one = i % 10;
            int result = thousand + hundred + ten + one + i;
            list1.add(result);
        }

        list.removeAll(list1);

        int result = 0;
        for(int i=0; i<list.size(); i++) {
            result += list.get(i);
        }

        System.out.println("총합은 : " + result);

    }

}

총합은 : 1227365

2019/07/22 10:02

김남일

import java.util.Arrays;

class generator {
    public int get (int a) {
        int sum=0, num;

        sum += a;
        while (a!=0) {
            num = a%10;
            sum += num ;
            a = (a-num)/10;
        }
        return sum;
    }
}

public class selfNum {

    public static void main(String[] args) {

        int range = 5000;
        int sum = 0;
        boolean[] intarr = new boolean[range];
        generator isself = new generator();

        Arrays.fill(intarr,true);

        intarr[0] = false;

        for(int i=1; i<intarr.length; i++) {
            int index = isself.get(i);

            if(index<intarr.length) {
                intarr[ index ] = false;
            }
        }

        for (int i = 1; i<intarr.length; i++) {
            if(intarr[i]==true) {
                //System.out.print(i + " ");
                sum+=i;
            }
        }
        System.out.println("");

        System.out.print(range + "보다 작은 셀프넘버의 합은 " + sum + "입니다.");

    }

}

좀더 간단하게 바꿔봤습니다.

import java.util.*;

public class selfNum2 {

    static Set<Integer> hasgeneset;
    static int hasgenesum = 0;

    public static void main (String[] args) {
        int range = 5000, rangesum = 0;

        hasGenerator(range);        

        if(range==1) rangesum=1;
        else rangesum = range * (range - 1) / 2;

        System.out.print(rangesum-hasgenesum);
    }       

    static void hasGenerator(int n) {

        hasgeneset = new HashSet<>();
        for (int i=1; i<n; i++) {

            String str = Integer.toString(i);
            int sum = i;
            for(int j=0; j<str.length(); j++) {
                sum+=Integer.parseInt(str.substring(j, j+1));

            }
            if(sum<n) {
                if(!hasgeneset.contains(sum)) {
                    hasgeneset.add(sum);
                    hasgenesum+=sum;
                }
            }   
        }       
    }       
}

2019/07/22 17:26

김준성

def d(n):
   return n + sum([int(x) for x in str(n)])

sum(set(range(1,5000)) - set(d(a) for a in range(1, 5000)))

2019/07/24 08:40

전병수

python 3.7

sum(set(range(1, 5000)) - {n + sum([int(i) for i in str(n)]) for n in range(1, 5000)})

2019/07/24 09:19

AY

def d(q):
    w=0
    for i in str(q):
        w+=int(i)
    w+=q
    return w
a=[d(x) for x in range(1,5000)]
b=[x for x in range(1,5000) if x not in a]
print(b)

``````{.python}

def d(q):
    return q+sum([int(x) for x in str(q)])

a=[d(i) for i in range(5000)]
b=[i for i in range(5000) if i not in a]
print(sum(b))

2019/07/24 12:32

유선종

lst_num = list(range(1, 5000))

for num in range(1, 5000):
    for x in str(num):
        num += int(x)
    try:
        lst_num.remove(num)
    except ValueError:
        continue

#print(lst_num)
print(sum(lst_num))

2019/07/24 14:26

py_code

def SelfNum_Sum(n):
    sum = 0
    for i in range(n-1):
        i_3 = (i // 1000, i % 1000)
        i_2 = (i_3[1] // 100, i_3[1] % 100)
        i_1 = (i_2[1] // 10, i_2[1] % 10)

        d_i = i + i_3[0] + i_2[0] + i_1[0] + i_1[1]

        sum = sum + d_i
    return sum

print(SelfNum_Sum(5000))

2019/07/24 18:23

윤민형

maxN = 5000
rgenList = []
for i in range(maxN):
    iStr = str(i)
    rgen = 0
    for j in range(len(iStr)):
        rgen += int(iStr[j])
    rgen += i
    rgenList.append(rgen)
selfList = list(filter(lambda x:rgenList.count(x) == 0, range(maxN)))
print(selfList)

2019/07/25 09:31

최혁제

def d(n)
    n+int(x) for x in str(n)
sum(set(range(1,5000))-set(d(x)for in range(5000)))

2019/08/02 22:40

yh

import java.util.*;

public class SelfNumber {
    public static void main(String[] args) {
        ArrayList<Integer> selfNumbers = new ArrayList<Integer>();

        for(int i = 1; i < 5000; i++) // populates ArrayList
            selfNumbers.add(i);

        for(int j = 1; j < 5000; j++) {
            if(selfNumbers.contains(generator(j)))
                selfNumbers.remove(generator(j));
        }

        int sum = 0;
        for(int num = 0; num < selfNumbers.size(); num++)
            sum += selfNumbers.get(num);

        System.out.println(sum);
        // outputs 1227365
    }

    public static Integer generator(int num) {
        int temp = num;
        int generator = 0;

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

        return (Integer) generator;
    }
}

2019/08/03 13:39

박어진

a = set(range(1,5001)) # numbers in {1,2,....,5000}

def d(num):  # definition of d(n)
    c= str(num)
    return sum(int(c[i]) for i in range(len(c)))+num

b = set(d(x) for x in a) # set of generated numbers

print(sum(a-b))

2019/08/04 04:00

Sechi

python

def generator(n): # 제너레이터를 발생시키는 함수
    result = []
    for i in range(1,n):
        a = list(str(i))
        sum_0 = 0
        for k in range(len(a)):
            sum_0 += int(a[k])
        sum = sum_0 + i
        if sum == n:
            result.append(i)
    return result
self_number_list = [i for i in range(1,5001) if len(generator(i)) == 0] # 제너레이터가 없는 경우만 선별
print(self_number_list)
sum(self_number_list)

2019/08/04 14:44

apriori


def compute_self_number(number):
    # 숫자를 문자로 변환 하자.
    sum = 0
    numstring = str(number)
    size = len(numstring)
    for i in range(0, size):
        sum += int(numstring[i])
    sum += number
#    print('inputed number=[%d], self_number=[%d]' %(number, sum))
    return sum


max_num = 5000
self_number_array = []

for i in range(1, max_num):
    self_number = compute_self_number(i)
    if self_number <= 5000:
        self_number_array.append(self_number)

# 중복제거
self_number_array = list(set(self_number_array))
# 0~5000 까지의 전체 집합 구성
set_all = [i for i in range(0, max_num + 1)]

# 차집합으로 self_numbrer가 아닌 리스트 구하기
set_complement = set(set_all) - set(self_number_array)

# self_number가 아닌 숫자들 리스트.
non_self_number_array = list(set_complement)

# non_self_number_array 리스트 합 구하기
sum_of_self_number = sum(non_self_number_array)

print('============ RESULT =============')
print(sum_of_self_number)

2019/08/05 20:39

불나방

def generator(num):
    num_s=str(num)
    s = num
    for n in num_s:
        s += int(n)
    return s
def prob(n):
    res=set()
    for i in range(1,n+1):
        temp = generator(i)
        if temp <= n:
            res.add(temp)
    sumN = n*(n+1)/2
    print(sumN - sum(res))
prob(10)

2019/08/06 12:20

최재학

var arr = [Bool](repeating: false, count: 5000)
var res = (1+5000)*5000/2

for i in 1..<arr.count{
    var val = i
    var j = i

    while j>0
    {
        val += j%10
        j = j/10
    }

    if val<5000{
        if arr[val]{
            res -= val
        }
        arr[val] = true
    }
}

2019/08/07 15:06

최현진

void main() {
    int sum = 0;
    int a, b, c, d, getr, i;
    int k = 5000;

    for (i = 1; i < k; i++) {
        sum += i;
    }
    for (i = 1; i < k; i++) {
        a = i / 1000;
        b = i / 100 - a * 10;
        c = i / 10 - (a * 100 + b * 10);
        d = i - (a * 1000 + b * 100 + c * 10);
        //printf("%d, %d, %d, %d, %d \n", a, b, c, d, i);
            getr = i + b + c + d;
        if (getr <= k){
            sum = sum - getr;
        }
    }
    printf("%d", sum);
}

2019/08/07 23:38

MC냥이

newlist =[]
for x in range(5000):
    newlist.append(x)

for N in range(5000):
    a = N // 1000
    b = (N-1000*a) // 100
    c = (N-1000*a-100*b)// 10
    d = N-1000*a -100*b -10*c

    gen = a+b+c+d+N
    if gen in newlist :
        newlist.remove(gen)

sum = 0
for x in newlist :
    sum = sum + x

print(sum)

2019/08/08 20:08

Minseok Choi

ListA=[]
for a in range(0,5):
    for b in range(0,10):
        for c in range(0,10):
            for d in range(0,10):
                ListA.append(a+b+c+d+d+10*c+100*b+1000*a)

setA=set(ListA)

setB={num for num in range(0,5000)}

setC=setB-setA

total=0

for num in setC:
    total+=num

print(total)

대학 수업에서 배운게 전부라 아직 많이 부족합니다.... 위에 있는 고수분들의 참조 답안들을 보며 열심히 공부하겠습니다.

2019/08/11 21:18

Timo

/////JAVACODE

public class Nexon{ int X = Y = 0; //X는 Y의 제너레이터 int A = 0; //A = 셀프 넘버인지 확인 할 숫자 int K = H = D = N = 0; //1000,100,10,0 자릿수

void process_1(){ //X의 자릿수 쪼개기 int tmp = 0; int x = this.X; if(x >= 1000){ K = x / 1000; tmp = x % 1000; x = tmp; } if(x >= 100){ H = x / 100; tmp = x % 100; x = tmp; } if(x >= 10){ D = x / 10; tmp = x % 10; x = tmp; } N = x; }

void process_2(){ //X의 제너레이터를 구한다. Y = K + H + D + N + X; }

int process_3(){ int i = 0;

//자릿수별 탐색할 범위 //(A - (자릿수 * 9)) ~ A if(A < 10){ i = 0; }else if(A < 100){ if(A <= 18) i = 0; else i = A - 18; }else if(A < 1000){ i = A - 27; }else if (A < 10000){ i = A - 36; }

for(int j = i; j < A; j++){ //셀프 넘버가 아니면 -1 맞으면 A리턴 reset(); X = j; process_1(); process_2(); if(A == Y){ return -1; } } return A; }

void reset(){ Y = K = H = D = N = X = 0; }

@override public String toString() { return "Nexon [X=" + X + ", Y=" + Y + ", A=" + A + ", K=" + K + ", H=" + H + ", D=" + D + ", N=" + N + "]"; }

public static void main(String[] args){ Nexon nx = new Nexon();

for(int i = 1; i <= 5000; i++){ nx.A = i; //A에 5000까지 넣고 확인 int tmp = nx.process_3(); if( tmp != -1) { System.out.println("find : " + tmp); } }

2019/08/13 14:06

성진한

d=@(n)sum(floor(mod(n./10.^(0:floor(log10(n'))),10)))+n;
temp=1:4999;
for ii=1:4999;temp=setdiff(temp,d(ii));end
disp(sum(temp))

1227365이 나옵니다. int를 string으로 바꾸지 않고 하고싶어서 이렇게 짰는데, 시간이 좀 걸리네요

2019/08/13 17:54

Joshua Zeu Y.

def d(x):
    ss=x
    for i in str(x):
        ss += eval(i)
    return ss

idic={}
for i in range(1, 5000):
    idic[i]=d(i)

jj=[]
for j in range(1, 5000):
    if j not in idic.values():
        jj.append(j)

print(sum(jj))

2019/08/18 10:47

J K

C#

    class Program
    {

        static int Calc (int a)
        {
            int sum = a;

            while (a > 0)
            {
                sum = sum + a % 10;
                a = a / 10;
            }
            return sum;
        }

        static void Main(string[] args)
        {
            int N = 5000;
            int dn = 0, i = 0;
            bool[] TF = new bool[N];

            while (Calc(i) < N)
            {
                TF[Calc(i)] = true;
                i++;
            }

            for (int k = 0; k < N; k++)
            {
                if (TF[k] == false)
                {
                    dn = dn + k;
                }
            }
            Console.WriteLine(dn);
        }
    }

2019/08/21 10:54

류원형

def d(n):
    result = n
    for i in str(n):
        result+=int(i)
    return result

r=set(range(1,5000))

for i in range(1,5000):
    a=d(i)
    if a in r:
        r.remove(a)

print(sum(r))

2019/08/21 21:26

ChoiGoBin

def make_d(n):
    o = n%10
    t = (n//10)%10
    h = (n//100)%10
    th = (n//1000)%10
    d = n+o+t+h+th
    return d

l = list(range(1, 5000))
s = set()
for i in l:
    s.add(make_d(i))
sn = set(l) - s

print(sum(sn))

2019/08/22 16:46

돔돔

#숫자 집합 정의
number_set = set(range(1, 5000))
#범위 내 제네레이터 요소 제거
for x in range(1, 5000):
#unit_number: 주어진 숫자 x를 자리수대로 분해한 것을 합한 결과
    unit_number = sum([int(y) for y in str(x)])
    number_set.discard(x + unit_number)

print("result :" + str(sum(number_set)))

2019/08/27 18:54

giantchoi

numbers=[]
total=0

for a in range(0,5000):
    number=0
    for b in list(str(a)):
        number+=int(b)
    number+=a
    if number not in numbers:
        if number <=5000:
            numbers.append(number)

for a in range(0,5001):
    if a not in numbers:
        total+=a


print(total)







2019/08/28 17:06

Cosu

Enumerable.Range(1, 5000).Except(from x in Enumerable.Range(1, 5000) select x + Enumerable.Sum(from n in x.ToString().ToCharArray() select int.Parse(n.ToString()))).Sum();

저 아름다운 코드를 C# LinQ로도 한번 풀이해봤습니다. 가독성에 차이가 크네용ㅎ

2019/08/29 14:58

yoonsyoons

C++

#include <iostream>
#include <set>
#include <numeric>
using namespace std;

int d(int n) {
    int res = n;
    while (n > 0) {
        res += n % 10;
        n /= 10;
    }
    return res;
}

int main() {
    set<int> not_selfnum;
    constexpr int MAX_N = 5000;
    for (int i = 1; i < MAX_N; i++) {
        int d_n = d(i);
        if (d_n < MAX_N) {
            not_selfnum.insert(d_n);
        }
    }
    constexpr int total = (MAX_N-1 + 1) * (MAX_N-1) / 2; // sum (1<= n < MAX_N)
    int res = total - accumulate(not_selfnum.begin(), not_selfnum.end(), 0);

    cout << res;
    return 0;
}

2019/08/30 10:28

왕초보

한자리 숫자의 합

Number = []

for Num in range(1,5000): One_Num = list(str(Num)) sum = 0 for i in One_Num: sum = sum + int(i) PlusNum = sum + Num Number.append(PlusNum)

s1 = set(sorted(Number))

1~5000까지의 숫자 저장

X = [] for i in range(1,5000): X.append(i) s2 = set(X)

차집합

y = s2-s1

셀프 넘버들의 합

sumY = 0 for index in y: sumY = sumY+index

print(sumY)

Python입니다 저는 이거 푸는데 엄청 걸렸네요..

2019/09/03 17:08

진수민

print(sum(set(range(1, 5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)}))

2019/09/04 00:33

철쇄아

import numpy as np

def findSelfNum(var):
    strVar = str(var)

    sum = var

    if len(strVar) == 1 :
        sum = sum + int(strVar[0])
    elif len(strVar) == 2 :
        sum = sum + int(strVar[0]) + int(strVar[1])
    elif len(strVar) == 3 :
        sum = sum + int(strVar[0]) + int(strVar[1]) + int(strVar[2])
    elif len(strVar) == 4 :
        sum = sum + int(strVar[0]) + int(strVar[1]) + int(strVar[2]) + int(strVar[3])
    else :
        print("error")

    return sum

selfNumArr = np.zeros(5037)

ans = 0

for i in range(1, 5001) :
    selfNumArr[ int(findSelfNum(i)) ] = 1

for i in range(1, 5001) :
    if selfNumArr[i] == 0 :
        ans = ans + i

print(ans)

2019/09/06 09:34

Pocky

def d(number): total = number number = str(number) for i in number: total += int(i) return total

result = set()

for i in range(1,5000): result.add(d(i))

finalresult = 0

for i in range(1,5000): if not i in result: finalresult += i

print(finalresult)

2019/09/09 13:49

김민규

PHP

$arr = range(1, 4999);
foreach ($arr as $k => $v) {
    unset($arr[array_sum(str_split(strval($v))) + $v - 1]);
}
$result = array_sum($arr);

print_r($result); // 1227365

2019/09/11 09:21

d124412

def non_self_num(num):
    result = num + sum([int(c) for c in str(num)])
    return result


nonSelfNum = set()
for n in range(1,5000):
    generatedNum = non_self_num(n)
    if generatedNum < 5000:
        nonSelfNum.add(generatedNum)

result = sum(set(range(1,5000)) - nonSelfNum)

print(result)

2019/09/11 16:53

ikc

package codingdojang.p789;

import java.util.Scanner;

public class Main {

public static int d(int n) { int result=n; String nStr = Integer.toString(n);

  for(int i=0;i<nStr.length();i++) {
     result+=Character.getNumericValue(nStr.charAt(i));
  }
  return result;

}

public static void main(String[] args) {

  Scanner input = new Scanner(System.in);

  System.out.print("Please insert the upper bound of the range: ");
  int upperBound = input.nextInt();

  int[] arr = new int[upperBound+1];
  for(int i=0;i<upperBound+1;i++) {
     arr[i]=i;
  }

  for(int i=0;i<upperBound+1;i++) {
     if (d(i)<=upperBound) arr[d(i)]=0;
  }

  int result=0;
  for(int i=0;i<upperBound+1;i++) {
     if (arr[i]!=0) result+=arr[i];
  }

  System.out.println(result);
  input.close();

}

}

2019/09/13 22:49

이혜민

#include <stdio.h>

int main(){
    int i, sum = 0, number[10000] = {0, }, n = 0; 
    for (i = 1; i <= 5000; i++){ 
        if(i < 10){
            n = i+i;
            number[n] = 1; 
        }
        else if(i < 100){
            n = i + (i/10) + (i%10);
            number[n] = 1;
        }
        else if(i < 1000){
            n = i + (i/100) + ((i%100)/10) + ((i%100)%10);
            number[n] = 1;
        }
        else if(i <= 5000){
            n = i + (i/1000) + ((i%1000)/100) + (((i%1000)%100)/10) + (((i%1000)%100)%10);
            number[n] = 1;
        }
    }

    for(i = 1; i < 5000; i++){ 
        if(number[i] != 1) {
            sum += i; 
        }
    }
    printf("%d\n", sum);
    return 0;
}

2019/09/15 23:13

J.EJ

def d(n):
    result = 0
    for i in tuple(str(n)):
        result += int(i)
    return result + n

def solve():
    result = list(range(1,5001))
    for i in range(5000):
        gen = d(i)
        if gen < 5001:
            try:
                result.remove(gen)
            except ValueError:
                pass
    return (sum(result))

print(solve())

2019/09/17 07:59

정병학

lists = []
for k in range(1, 5000):
    for i in range(len(str(k))):
        k += int(str(k)[i])
    lists.append(k)

total_lists = range(5000)
print(sum(set(total_lists)-set(lists)))

2019/09/25 17:55

JB Youn

#include <stdio.h>

int main()
{
    int num[5000] = { 0 };
    int generator[5000] = { 0 };
    int i, j;
    int sum=0;

    for (i = 0; i < 5000; i++)
        num[i] = i + 1;

    for (i = 0; i < 5000; i++)
    {
        generator[i] += num[i]/1000;
        generator[i] += (num[i] / 100) %10;
        generator[i] += num[i] / 10 % 10;
        generator[i] += num[i] % 10;
        generator[i] += num[i];


    }
    for (i = 0; i < 5000; i++)
    {
        for (j = 0; j < 5000; j++)
        {
            if (num[i] == generator[j])
                num[i] = 0;
        }

        sum += num[i];

    }

    printf("%d", sum);

    return 0;


}

2019/09/26 05:31

BTSS KIM

한줄코드

sum(list(filter(lambda y : y not in gen=[eval('+'.join(str(x)))+x for x in range(1,5000)], range(1,5000))))

너무 느린 경우 아래 코드로

gen=[eval('+'.join(str(x)))+x for x in range(1,5000)]
sum(list(filter(lambda y : y not in gen, range(1,5000))))

2019/09/26 15:31

jeipro

fr, rea = list(range(1, 5001)), []   # 5000까지의 자연수로 이루어진 리스트 셀프 넘버의 리스트 선언
for n in range(1, 5001):
    gen = n
    for i in str(n) :
        gen += int(i)
    rea.append(gen)    #셀프 넘버가 아닌 수들을 계산, rea에 추가

fr_s, rea_s = set(fr), set(rea)       #집합으로 변환
print(sum(fr_s - rea_s))

결과

1227365

2019/09/26 16:36

GG

C# Interactive

var R = Enumerable.Range(1, 5000);
R.Except(R.Select(n => n + n.ToString().Sum(c => c - 48))).Sum()

결과: 1227365

--

C# Application

class Program
{
    static void Main()
    {
        var R = Enumerable.Range(1, 5000);
        Console.WriteLine(R.Except(R.Select(n => n + n.ToString().Sum(c => c - 48))).Sum());
    }
}

결과: 1227365

2019/09/29 16:20

씨샵 짱짱맨

# Variable, list declaration
list_0 = []; a = 0; s = 0; num = 0; k = 0
# Sum of number(0~5000)
for i in range(5000):
    k += i
# Algorithm 
for i in range(5000):
    for j in str(i): a += int(j)
    num = a+i; a = 0
    if num > 4999: break
    list_0.append(num)
# Intersection of not self number
list_1 = set(list_0)
list_1 = list(list_1)
# Sum of list
for i in range(len(list_1)): s += list_1[i]
# Output 
print(k - s) # Subtract k - s

저만 너무 복잡하게 풀었네요

2019/10/03 14:08

이명운

def generator(n):
    n_len = int(len(str(n)))
    if n_len == 1:
        return n+n
    elif n_len == 2:
        return (n+int(n/10)+int(n%10))
    elif n_len == 3:
        return (n+int(n/100)+int(n%100/10)+int(n%10))
    elif n_len == 4:
        return (n+int(n/1000)+int(n%1000/100)+int(n%100/10)+int(n%10))


ans = [i for i in range(1,5001)]

for i in range(1,5001):
    if generator(i) in ans:
        ans.remove(generator(i))

print(sum(ans))

파이썬 야매코딩..

2019/10/06 15:35

후눈

문제 1)

generator =  set(range(1,5000)) - {num + sum([int(digit) for digit in str(num)]) for num in range(1, 5000)}
print(sum(generator))

2019/10/10 21:44

김남곤

package CodingDojang;

public class NexonQuiz {
    public static void main(String[] args) {
        int[] ans = new int[5000];      
        int a, b, c, d, result, sum = 0;

        for(int i = 0; i < 5000; i++) {
            a = i / 1000;
            b = (i / 100) % 10;
            c = (i / 10) % 10;
            d = i % 10;

            result = a + b + c + d + i;
            if(result >= 1 && result < 5000)
                ans[result] = 1;        
        } 

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

2019/10/13 02:09

이유환

def generator(num):
    generator = 0
    number = []
    number.append(str(num))
    for i in range(len(str(num))):
        generator += int(number[0][i])
    return generator + int(number[0])


result = []
for i in range(1, 5000):
    a = generator(i)
    result.append(a)
result = set(result)
real = []
for a in range(1, 5000):
    try:
        result.remove(a)
    except:
        real.append(a)
print(real)
realresult = 0
for c in real:
    realresult += c
print(realresult)

2019/10/16 17:33

빨간광물

Python 3.7.4

s_tot = set(range(1,5000))

for i in range(1,5000):
    x = 0    
    for j in str(i):
        x += int(j)
    s_tot.discard(i+x)

print(sum(s_tot))

2019/10/16 21:55

Koh KT

def function(data):
    str_data = str(data)
    temp = 0
    result = 0
    for i in range(len(str_data)):
        temp += int(str_data[i])
    result = data + temp
    print(result)

function(91)
function(113)

2019/10/19 00:05

semipooh

print(sum(set(range(1, 5000)) - set([sum([int(i) for i in str(num)]) + num for num in range(1, 5000)])))

2019/10/23 11:35

jawoongku

nature_number=set(range(1,5001))
generated_number=set()

for i in range(1,5001):
    for j in str(i):
        i+=int(j)
    generated_number.add(i)

self_number=nature_number-generated_number
print(sum(self_number))

2019/10/25 09:45

생선집알바

def d(n):
    a=0
    t=n
    while n>0:
       a+=n%10
       n=int(n/10)
    t+=a
    return t
s=[]
for i in range(1,5000):
    s.append(d(i))

c=0
for j in range(1,5000):
    if s.count(j)==0:
        c+=1
print(c)

2019/10/28 01:18

이경구

#include <stdio.h>
int generator(int num);
int main()
{
    int sum = 0;
    for (int i = 1; i <= 5000; i++)
    {
        sum += i;
    }

    for (int i = 1; i <= 5000; i++)
    {
        for (int j = 1; j <= 5000; j++)
        {
            if (i == generator(j))
            {
                sum -= i;
                break;
            }
        }
    }

    printf("%d\n", sum);
}
int generator(int num)
{
    int arr[4] = {0};
    int i = 0;
    int gen = num;

    while (num > 0)
    {
        arr[i] = num % 10;
        i++;
        num /= 10;
    }

    for (int i = 0; i < 4; i++)
    {
        gen += arr[i];
    }

    return gen;
}

2019/11/09 18:19

김현민

n=0
gen=[]
nogen=[]
while True :
  n=n+1
  dn=int(n/10)
  nn=n-10*dn
  result=dn+nn+n
  gen.append(result)
  if n not in gen:
    nogen.append(n)
  elif n > 5000:
    break
print(sum(nogen))

2019/11/11 11:30

Red brick

자바 배열로 풀었는데 배열 연습에 좋은 공부가 되었습니다. cpu연산적 효율은 생각하지 않았네요 숫자가 커진다면 코드의 개량이 필요해 보입니다.

import java.util.ArrayList;

public class Test{  

static  ArrayList<Integer> aList = new ArrayList<Integer>(); // static aList    

public void array5000() {                       // array 1 to 5000
    for(int i=1; i<=5000; i++) {    
        aList.add(i);
        }
}

public void remove() {                          //check and remove from Array
    int check=0;
    for(int e = 0; e<=5000; e++) {
        int a,b,c,d;
        a = e/1000%10;
        b = (e/100)%10;
        c = (e/10)%10;
        d = e%10;

        check = a + b + c + d + e;

        aList.remove((Integer.valueOf(check)));
        }
}

public int sumList() {                          //sum all the rest
    int sum=0;
    for(int i=0; i<aList.size(); i++ ) {
        sum += aList.get(i);
        }
    return sum;
}

public static void main(String[] args) {
    Test test = new Test();
    test.array5000();
    test.remove();

    System.out.println(test.sumList());
}}

2019/11/12 00:18

Arisia T

제네레이터를 생성하는 객체를 따로 생성하였습니다.(1000단위 까지) 리스트기능을 따로 사용하지않고 배열만으로 코딩을 하다보니 확실히 머리가 깨질것 같더군요;;;

package nexon_test;

public class GeneratorMain {

    public static void main(String[] args) {

        Generator gen = new Generator();
        int genNum = 0;
        int num = 0;    
        int[] arr = new int[5000];

        int sum = 0;
        outer : for (int i = 0; i < arr.length;i++) {
            genNum = i+1;
            num = gen.toGen(genNum);
            arr[i] = num;
            //System.out.print(genNum + " -> ");
            //System.out.println(arr[i]);


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

                if(arr[j] == genNum ){
                    continue outer;
                }
            }//inner
            System.out.println("self number: " + genNum);
            sum += genNum;    
        }//outer
        System.out.println(sum);
    }//main

}

``````{.java}
package nexon_test;

public class Generator {        

    private int num;

    public int toGen(int gen) {

        if(gen < 10) {//한 자리수일때
            num = gen + gen;
        }else if (gen < 100) {//두 자리 수 일때
            num = gen + gen/10 + gen%10;
        }else if (gen < 1000) {//세 자리 수 일때
            num = gen + gen/100 + (gen/10)%10 + (gen%100)%10;
        }else if (gen < 10000) {//네 자리 수 일 때
            num = gen + gen/1000 + (gen/100)%10 + (gen%100)/10 + (gen%1000)%100%10;;
        }

        return num;
    }//toGen

}

고로 정답 1227365

2019/11/14 22:39

권태욱

#include <iostream>
using namespace std;

int x[50001];

int d(){
    int tmp,temp=0,result=0;

    for(int i=1;i<=5000;i++){
        tmp=i;
        temp=tmp;
        while(tmp!=0){
            temp+=(tmp%10);
            tmp/=10;
        }
        x[temp]++;
    }

    for(int i=1;i<=5000;i++){
        if(x[i]==0){
            result+=i;
        }
    }

    return result;
}

int main(){
    cout<<d();
}

2019/11/16 12:10

저택벚꽃

제너레이터를 하나씩 찾아 selfNumbers 배열에 false로 찍고 나중에 true인 아이들만 더합니다.

소스코드(Java)

public class SCODE365 {
    public static void main(String[] args){
        boolean[] selfNumbers = new boolean[5000];
        for(int i=0; i<selfNumbers.length; i++) { selfNumbers[i] = true; }
        int sum = 0;
        for(int g=0; g<5000; g++) {
            int num1 = g/1000;
            int num2 = ( g-(num1*1000) )         /100;
            int num3 = ( g-(num1*1000+num2*100) )/10;
            int num4 = g-(num1*1000+num2*100+num3*10);
            int index = num1+num2+num3+num4+g;
            if(index>=1 && index<5000) { selfNumbers[index] = false; }
        }
        for(int i=0; i<selfNumbers.length; i++) { sum += selfNumbers[i] ? i:0; }
        System.out.print(sum);      
    }
}

결과

1227365

2019/11/19 04:06

Kimbell Jone

def gen(n):    
    gen = 0
    for c in str(n):
        gen += int(c)
    gen+=int(n)
    return gen

def sum_self_no(k):
    no_pool = range(1, k)
    has_generators = [gen(n) for n in range(1, k)]
    self_no = list(set(no_pool) - set(has_generators))
    return sum(self_no)

print(sum_self_no(5000))

2019/11/20 17:49

vkospi

1~5000까지의 Integer타입 LinkedList, 1~5000까지의 String타입 LinkedList를 하나씩 만들어서 String타입의 list로 계산을 하고 구한 셀프 넘버를 Integer타입의 list에서 remove해주고 남은 값을 모두 더했습니다.

package namchulEx;

import java.util.LinkedList;

public class Ex01_Nexon {
    static LinkedList<Integer> resultList = new LinkedList<Integer>();
    static LinkedList<String> comList = new LinkedList<String>();

    public static void main(String[] args) {
        int sum =0;


        for(int i=0;i<5000;i++) {
            resultList.add(i+1);
        }

        for(int i=0;i<5000;i++) {
            comList.add(Integer.toString(i+1));
            if(resultList.contains(compute(comList,i))) {
                resultList.remove(new Integer(compute(comList,i))); 
            }
        }

        for(int i=0;i<resultList.size();i++) {
            sum += resultList.get(i);
        }       
        System.out.println(resultList);
        System.out.println(sum);

    }
    public static int compute(LinkedList<String> comList, int i2) {
        String str = comList.get(i2);
        int n=0;
        for(int i=0;i<str.length();i++) {
            n += Character.getNumericValue(str.charAt(i));
        }
        n += Integer.parseInt(str);
        return n;
    }

}

2019/11/28 12:22

남김남철

파이썬으로 for와 while을 이용해 만들어 봤습니다.

e = []
for i in range(5000):
    a = i//1000 
    b = (i-a*1000)//100
    c = (i-a*1000-b*100)//10
    d = (i-a*1000-b*100-c*10)%10
    e += [a+b+c+d+i]

loop = 1
sum = 0
while loop < 5000:
    if not loop in e:
        sum += loop       
    loop += 1     

print(sum)

2019/12/01 12:57

ong

Fortran 77

코드를 짜다보니 self-number를 구해버려서... 전체에서 self-number를 뺴는 방향으로 했습니다

c234567
c 1이상 5000미만인 self-number의 합
      program self_number
      integer a(1:5000), c(1:5000), s(1:5000), d(1:5000), nn, res, dum
      integer dum2
c initialization
      data nn, res/5000, 0/
      c=0
      s=0
      d=0
c a(i)는 i
      do i=1,nn
          a(i)=i
      end do
c c(i)는 a(i)의 자릿수-1 (10**n의 최대 n)
      do i=1,5000
          do j=3, 0, -1
              If (i/(10**j) .LT. 10) then
                  c(i) = j
              end if
          end do
      end do
c s(i)는 a(i)의 각 자릿수의 합
      do i=1,5000
          dum=i
c dum2는 dum의 10**j 자릿수
c s(i) =+ dum2 하여서 자릿수의 합을 만든다
c dum에서 dum2 * 10**j를 빼서 처음부터 반복
          do j=c(i),0,-1
              dum2=dum/(10**j)
              s(i)=s(i)+dum2
              dum=dum-dum2*(10**j)
          end do
c d(i)는 s(i) + i (각 자릿수의 합과 자기 자신의 합)
          d(i)=s(i)+i
      end do
c 서로 다른 수의 generator가 같은 경우 0으로 해서 겹치지 않게 함 
c generator가 5000보다 크면 0으로 해서 필요하지 않은 수를 제외
      do i=1,nn
          do j=1,nn
              If ((d(i) .EQ. d(j) .AND. i .NE. j) .OR. (d(j) .GE. 5000))
     ~then
                  d(j)=0
              else
              end if
          end do
      end do
c res는 1이상 5000미만인 d(i)의 합
      do i=1,nn
          res=res+d(i)
      end do
c 1이상 5000미만인 수의 합 = ind    
      ind=4999*5000/2
c ind - res는 5000미만인 d(i)가 없는 수의 합
      print *, 'The answer is', ind-res
c 정답은 1227365
      stop
      end

2019/12/06 11:54

YSM

#include <iostream>

using namespace std;

int board[5001];

int solution();
int getGenerator(int n);

int main()
{
    cout << solution() << endl;
    return 0;
}

int solution() {
    int answer = 0;

    for(int num = 1; num <= 5000; num++) {
        board[getGenerator(num)] = 1;
    }

    for(int num = 1; num <= 5000; num++) {
        if(!board[num]) {
            answer += num;
        }
    }

    return answer;
}

int getGenerator(int n) {
    int generator = 0;
    int tmp = n;

    while(tmp >= 10) {
        generator += (tmp % 10);
        tmp /= 10;
    }
    generator += tmp;

    return generator;
}

2019/12/16 11:50

정동건

def d(n):
    comp = list(map(int,list(str(n))))
    return n + sum(comp)

Gens = [d(i) for i in range(5000)]
Self = [i for i in range(5000) if i not in Gens]
print(sum(Self))

1227365


파이썬입니다. 추천1등 분이랑 다른점은 자릿수 분리를 다르게 했다는 점 ..? 집합도 사용해봐야겠네요

2019/12/18 10:06

이효주

# step 1. generator를 구하는 코드 만들기.

def d(n):
    gen = 0
    for i in str(n):
        gen += int(i)
    return gen + n

# step 2. n 이하의 self-numbers를 list에 넣는 코드 만들기.

n = int(input("몇 이하의 self-number를 구할까요? :", ))
A = [d(i) for i in range(1,n) if d(i) < n]
self_number = [i for i in range(1,n) if i not in A]

# step 3. self-numbers의 합을 출력

print(sum(self_number))

2019/12/18 13:36

D.W. Choi

파이썬3입니다.


sum(set(range(1,5000)) - set(i + sum([int(n) for n in str(i)]) for i in range(1, 5000)))

2019/12/21 11:54

Sean

c언어로 작성하였습니다 얼마전 대학교 1학년 2학기때 c언어 수업을 처음 들어서 코드가 좀 어설픈거 같네요..ㅠㅠ 오늘부터 연습해야죠

#include <stdio.h>

int d(int number);

int main() {
    int total = 0;
    for (int i = 1; i < 5000; ++i) {
        if (d(i) == 1) {
            total += i;
        }
    }
    printf("1이상이고 5000보다 작은 self-number들은 합은 %d이다.", total);
}

int d(int number) {
    int first = 0, second = 0, third = 0, forth = 0;

    // 셀프넘버인지 확인 
    for (int j = 1; j <= number; ++j) {

        //각 자리수 구하기
        first = j % 10;
        second = (j % 100) / 10;
        third = (j % 1000) / 100;
        forth = j / 1000;

        // number가 셀프넘버가 아니면 0반환
        if (number == j + first + second + third + forth) {
            return 0;
        }
    }

    // number의 셀프넘버면 1반환
    return 1;
}

2019/12/23 16:23

심심하당고

#include <stdio.h>
#include <math.h>

int main() {
    int check[5000] = { 0 };
    int temp, temp_count, sum, count;

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

        temp_count = i;
        do {
            temp_count /= 10;
            count++;
        } while (temp_count > 0);
        count--;

        do {
            if (temp > 9) {
                sum += (temp / pow((double)10, (double) count));
                temp %= (int)pow((double)10, (double)count);
                count--;
            }
            else {
                sum += temp;
                temp = 0;
            }
        } while (temp > 0);
        check[sum - 1]++;
    }
    sum = 0;

    for (int i = 0; i < 5000; i++) {
        if (!check[i])
            sum += (i + 1);
    }
    printf("1 이상이고 5000보다 작은 모든 셀프 넘버들의 합 = %d\n", sum);
}

답 : 1227365

아직도 너무 많이 부족합니다... 계속 배워야겠습니다.

2019/12/24 01:43

OverEasy

Javascript(ES6)...

'1 ~ 5000 까지 숫자를 채운 numbers 배열 설정, 1 ~ 5000 까지 반복문을 돌면서 제너레이터를 가진 숫자를 have_gen_numbers 배열에 담음, have_gen_numbers 에 해당하지 않는 숫자들을 self_numbers 배열에 담고, 이 숫자들을 합산하여 출력';

// 1 ~ 5000 까지 numbers 설정
const MAX_NUM = 5000
let numbers = [...Array(MAX_NUM).keys()].splice(1);

// 제너레이터를 가진 숫자들을 have_gen_numbers 배열에 담음
let have_gen_numbers = [];
for(let i of numbers) {
    let gen_numbers = i + [...i.toString()].reduce((a, v) => a + Number(v), 0);
    if(have_gen_numbers.indexOf(gen_numbers) == -1) {
        have_gen_numbers.push(gen_numbers);
    }
}

// 제너레이터를 가진 숫자들을 제외한 self_numbers 배열을 만들고 그 합산 결과를 출력
let self_numbers = numbers.filter(v => have_gen_numbers.indexOf(v) == -1);
let output = self_numbers.reduce((a, v) => a + v, 0);
console.log(output);    // 1227365

Python 3

# 1 ~ 5000 까지 숫자 리스트
MAX_NUM = 5000
nums = [x for x in range(1, MAX_NUM + 1)]

# 제너레이터를 가진 숫자들을 리스트
have_gen_nums = [x + sum(int(y) for y in [*str(x)]) for x in range(1, MAX_NUM + 1)]

# 셀프넘버 리스트를 생성하고, 그 합계를 출력
self_nums = [x for x in nums if x not in have_gen_nums]
print(sum(self_nums))    # 1227365

2019/12/24 14:42

tedware

#제너레이터를 구하는 함수
def d(n):
    n=str(n)
    x=0
    for i in range(len(n)):
        x+=int(n[i])
    n=int(n)+x
    return n

# 셀프 넘버들의 합 구하기    
k=1
t=0
l1=[]
while d(k)<5000:
    d(k)
    if d(k) not in l1: #91과 100의 경우와 같이 중복을 피하기 위함
        l1.append(d(k))
        t+=d(k) 
    k=k+1

# 1이상 5000미만의 숫자들의 합에서 셀프 넘버들의 합 빼기    
total=0
for i in range(1,5000):
    total+=i
print(total-t) # 1227365

2019/12/24 15:27

박시원

파이썬

not_self_list=[]
for i in range(1,5001):
    hap=0
    for j in str(i):
        hap+=int(j)
    hap+=i
    not_self_list.append(hap)    

all_number=[i for i in range(1,5001)]

self_number = sorted(list(set(all_number) - set(not_self_list)))

2019/12/27 14:24

data big

def d(n):
    for i in str(n):
        n +=int(i)
    return n

a=set(list(range(1,5000)))
b=set()
for i in a:
      b.add(d(i))
print(sum(a-b))

2019/12/28 17:17

뚜루꾸까까

a=1
x=0
y=0
z=0
w=0
result=[]
final=0
for a in range(1,5000):
    for x in range(0.4):
        for y in range(0,9):
            for z in range(0,9):
                for w in range(0,9):
                    if a==1000*x+100*y+10*z+w:
                        result=result+[a]
    if result==[]:
        final=final+a
print(final)

2020/01/14 12:31

Michael

def d(n):
    d = n
    i = 1
    while True:
        if n // i == 0:
            return d
        d += n//i%10
        i *= 10

a = list(range(5000))

for i in range(1,5000):
    a[d(i) * (d(i) < 5000)] *= 0

print(sum(a))

2020/01/14 22:20

우재용

파이썬으로 한 번 해봤습니다.

NonSelfNum = list()

for n in range(1, 5000):
    i = n + sum([int(a) for a in str(n)])
    if i < 5000:
        NonSelfNum.append(i)

print(sum(set(range(1, 5000)) - set(NonSelfNum)))

2020/01/18 23:59

추영욱

class GetGenerator { int result;

int Generator(int i) {
    int result = (i / 1000) + (i % 1000) / 100 + (i % 100) / 10 + ( i % 10 ) + i;
    return result;
}

}

class 제너레이터 { public static void main(String[] args) { GetGenerator g = new GetGenerator();

    int[] hasGenerator = new int[5000];
    int[] result = new int[5000];
    int total = 0;

    for(int i = 1; i <= 5000; i++)
    {
        hasGenerator[i - 1] = g.Generator(i); 
    }

    for(int i = 1; i <= 5000; i++)
    {
        for(int j = 0; j < 5000; j++)
        {
            if(i == hasGenerator[j])
            {
                result[i - 1] = 1;
            }
        }
    }
    for(int i = 0; i < 5000; i++)
    {
        if(result[i] == 0)
        {
            total += i + 1;
        }
    }
    System.out.printf("결과는 %d이다.", total);
}

} // 결과는 1227365 입니다.

2020/02/03 18:24

하루

def generator(num):
    result = int(num/1000) + int((num%1000)/100) + int((num%100)/10) + num%10 + num
    return result;



nonself = []

for i in range(1, 5001, 1):
    temp = generator(i)
    if temp < 5000:
        nonself.append(temp)


nonself_ = list(set(nonself))

sum(range(1, 5000, 1))-sum(nonself_)

2020/02/05 23:18

관종이다

a = set(range(1, 5000))

b = set()

for i in range(1, 5000):
    d = i + (sum(map(int, list(str(i)))))
    b.add(d)

print(sum(a - b)) 

2020/02/06 13:35

김희준

n = 1
selfnum_list = []
selfnum_sum = 0


#  셀프넘버 목록 생성
for i in range(1, 5000):
    selfnum_list.append(i)


# print(selfnum_list)

def cal_generate_num(num):
    tmp = num
    for j in range(0, len(str(num))):
        tmp = tmp + int(str(num)[j])
        # print(tmp)
    return tmp


while cal_generate_num(n) < (5000 * 1.2):
    try:
        selfnum_list.remove(cal_generate_num(n))
    except:
        pass
    n = n + 1

for k in selfnum_list:
    selfnum_sum = selfnum_sum + k

print(selfnum_sum)

파이선 3.7

2020/02/06 14:36

DrKilling

def e(n):
    if n >= 1000:
        a = n // 1000
        b = (n - (a * 1000)) // 100
        c = (n - (a * 1000) - (b * 100)) // 10
        d = n - (a * 1000) - (b * 100) - (c * 10)
    elif 100 <= n < 1000:
        a = 0
        b = n // 100
        c = (n - (b * 100)) // 10
        d = n - (b * 100) - (c * 10)
    elif 10 <= n < 100:
        a = 0
        b = 0
        c = n // 10
        d = n - (c * 10)
    else: 
        a = 0
        b = 0
        c = 0
        d = n
    return(a + b + c + d + n)

n = 1
m = []
while n < 5000:
    m.append(e(n))
    n = 1 + n
o = []
for o1 in range(1,5001):
    o.append(o1)

mm = set(m)
oo = set(o)

ooo = oo.difference(mm)
print(sum(ooo))

2020/02/14 10:14

Junghan Shin

자바로 풀었어요.

import java.util.ArrayList;
import java.util.TreeSet;

public class SelfNumber {
    public static void main(String[] args) {

        ArrayList number = new ArrayList();
        int x = 0;
        for(int a =0; a<5; a++) {
            for(int b = 0; b<10; b++) {
                for(int c = 0; c<10; c++) {
                    for(int d = 0; d<10; d++) {
                        int k = 0; 
                        k = a*1000+b*100+c*10+d;
                        int v = a+b+c+d+k;
                        number.add(v);
                    }
                }
            }
        }

        ArrayList number2 = new ArrayList();
        for(int d = 0 ; d<5001; d++) {
            number2.add(d);
        }

        TreeSet tree = new TreeSet(number);
        number2.removeAll(tree);

        for(int e=0; e<number2.size();e++) {
        Object q = number2.get(e);
        int g = (int) q; 
        x += g;
        }

        System.out.println(number2);
        System.out.println(x);
    }
}

2020/02/14 13:05

김경수

파이썬 3.8
array = [] # 제네레이터가 있는 수들의 집합
for i in range(1,5001): # 제네레이터가 있는 수들을 구합니다.
    str_i = str(i) # 문자열로 변형
    len_i = len(str_i) # 변환한 문자열의 길이
    t = 0
    for j in range(len_i): # 각 자리수들의 합
        t += int(str_i[j])
    t += i
    array.append(t)

result = 0
for i in range(1,5001):
    if i in array: 
        continue
    result += i  # 제네레이터에 해당하는 수가 없으면 result에 해당수를 더합니다.
print(result)
**1227365**

2020/02/16 18:10

카레맛카레

파이썬 3.8.1 입니다.

#-*- coding:utf-8 -*-

def d(n): #제너레이터 정의
    temp_li = list(str(n)) #각 자리 분리
    sum_li = sum(list(map(int,temp_li))) # 분리된 수의 합
    return sum_li + n #자기 자신과 합

generator_li = set()
for n in range(1,5000): # 제너레이터들 모음
    generator_li.add(d(n))

self_num = set(range(1,5000)) - generator_li #셀프 넘버 리스트
print(sum(self_num)) # 셀프 넘버들의 합

2020/02/18 23:45

Sanghyuk Woo

def d(n):
    nn = str(n)
    sum = n
    for s in nn:
        sum += int(s)
    return sum

def dset(i, j):
    result = set()
    for x in range(i, j):
        result.add(d(x))
    return result

print(sum(set(range(1, 5000)) - dset(1, 5000)))

2020/02/20 23:30

러너비

안녕하세요! 아직 걸음마 중인 초보입니다..^^ 이렇게 좋은 곳을 만들어 주셔서 너무 감사드립니다.

이 문제에 대해 저는 5000까지의 모든 숫자를 리스트로 만든 다음 1부터 4999까지의 수를 적용하여 제너레이터의 집합을 만들고 두 집합의 차집합을 구해서 그 차집합의 합을 더하는 식으로 코드를 짜봤습니다. 많이 허접하지만 이쁘게 봐주세요..^^

a = list(range(1,5000)) #1부터 4999까지의 집합
b = [] #제너레이터들을 모을 리스트
for i in a: #제너레이터만들기
    _str = str(i) #각자리수쪼개기위해 문자형으로 만들기
    _list = list(_str) #문자형을 리스트로 만들기
    _generator = 0 #제너레이터만들기위한 변수 지정
    for j in _list:
        _generator += int(j) #리스트에 있는 데이터를 정수형으로 바꿔 더하기
    hap = i + _generator #제너레이터 완성
    b.append(hap) #제너레이터를 리스트에 더해주기
c = set(a)-set(b) #기존 1~4999집합에서 제너레이터 빼기
print(sum(c)) #차집합의 합 구하기

답은 1227365가 나왔습니다. 맞는 것이겠죠?^^(비교해보니 맞는 것 같긴 하네요.) 힘들지만 재미있었습니다!

2020/02/26 17:34

David Kim

check={}
for i in range(5000):
    check[i]=True
for i in range(2500):
    s=i%10 + (i%100)//10 + (i%1000)//100 + i//1000 + i 
    if check[s]==True :
        check[s]=False
sum=0
for i in range(5000):
    if check[i]==True:
        sum=sum+i
print(sum)

2020/03/06 14:02

sotmef222

python

self_numbers = []
generated_numbers = []
temp_number = 0
generated_number = 0
for n in range(1, 5000):
    str_n = str(n)
    for d in range(0, len(str_n)):
        temp_number += int(str_n[d-1])
    generated_number = temp_number + n
    generated_numbers.append(generated_number)
    temp_number = 0
    generated_number = 0

generated_numbers = set(generated_numbers) #중복된 값 제거
original = set(range(1,5000))
self_numbers = original - generated_numbers

print(sum(self_numbers))

2020/03/06 16:47

Junghoon Kim

i_result = eval(str(list(set(range(1,5001)) - {eval(str(i) + '+' + '+'.join(str(i))) for i in range(1, 5000)}))[1:-1].replace(',','+'))

2020/03/07 11:00

Yanghee Lee

def split_word(word):
    return [char for char in word]

# print(sum( int(i) for i in split_word("11")))

max_num = 5000
gen_num = []
for i in range(1, max_num+1):
    gen_num.append(sum( int(i) for i in split_word(str(i)))+i)


remove_dup_gen_num = list(set(gen_num))
# print(remove_dup_gen_num)
all_num = list(range(1, max_num+1))
# print(all_num)

non_used_num = list(set(all_num) - set(remove_dup_gen_num))
# print(non_used_num)
print(sum(non_used_num))

2020/03/19 00:52

뤼크

def gen(n):
    d = 0
    for i in list(str(n)):
         d = d + int(i)
    return d + n

def self(n):
    g = []
    s = []
    for i in range(1, n):
        g.append(gen(i))

    for i in range(1, n):
        if i in g:
            pass
        else:
            s.append(i)

    sum = 0
    for i in s:
        sum = sum + i

    print(s)
    print(sum)

self(5000)

2020/03/19 15:32

봄바람솔솔

  1. 1 to 4999 합 먼저 구함
  2. 1 to 4999 순회하면서:
  3. generator number 계산
  4. 계산한 generator number가 이전에 이미 기록된 것인지 확인
  5. 이미 기록되지 않은 것이라면 앞서 구한 합에서 뺌
  6. 기록된 generator number임을 명시
  7. 결과 출력
#include <stdio.h>

static const unsigned MAX_NUM = 5000;

constexpr unsigned calGenerator(unsigned n){
    return (n % 10) + ((n / 10) % 10) + ((n / 100) % 10) + ((n / 1000) % 10) + n;
}
constexpr unsigned accumulateOneToN(unsigned n){
    return (n * (n + 1)) >> 1;
}

int main(){
    unsigned s = accumulateOneToN(MAX_NUM - 1);

    unsigned char hasGen[MAX_NUM - 1] = { 0, };

    for(unsigned i = 1; i < MAX_NUM; ++i){
        unsigned g = calGenerator(i);

        if(g < MAX_NUM){
            unsigned char* p = &hasGen[g - 1];

            if(!(*p))
                s -= g;

            *p = 1;
        }
    }

    printf("%u", s);

    return 0;
}

2020/03/20 15:45

Taewoo Lim

#include <iostream>
#include <string>
#include <vector>
using namespace std;
/*
어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.
*/

//정답:1227365
void Func(int n) {
    int sum;
    vector<int> v;
    for (int i = 1; i < n; i++) {
        sum = 0;
        string s = to_string(i);
        for (int j = 0; j < s.length(); j++) {
            sum += (s[j] - '0');
        }
        sum += i;
        v.push_back(sum);
    }
    int total = 0;
    cout << "셀프 넘버:";
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < v.size(); j++) {
            if (i == v[j]) { break; }
            if (i == n - 1 && j == v.size() - 1) { total += i; cout << i << " = "; break; }
            if (j == v.size() - 1) { total += i; cout << i << " + "; break; }
        }
    }
    cout << total << endl;
}

int main() {
    Func(5000);
}

2020/03/20 16:35

++C

 # 10**(len_num-1) 첫번째 숫자를 나타낸다. 
 # while문 사용해서 (len_num-1)이 0이 되면 즉시 탈출. 

def generator(x):
    n=x
    len_num=len(str(n))
    sum=0

    while len_num>0:
        len_num-=1
        #print('len_num은',len_num,'입니다')   
        sum+=(n//(10**(len_num)))
        #print('합은',sum,'입니다')
        n=n%(10**len_num)
        #print('n은',n,'입니다')
    result_sum=x+sum

    #print('결과는',result_sum,'입니다')
    return result_sum


i=1  
nun_selfsum=[]


count_morethan_5000=0
while i<5000:
    print('숫자는',i)
    print('generator는',generator(i))

    if generator(i)<5000:
        nun_selfsum.append(generator(i))

    i+=1    


x=set(range(1,5000))
self_num_set=x-set(nun_selfsum)
sum(self_num_set)


``````{.python}

2020/03/24 18:23

김가영

a=0
f=0
for k in range(1,5000):
    for i in range(k):
        if i+sum([int(q) for q in str(i)])==k:
            a+=1
        else:
            pass
    if a==0:
        f+=k
    else:
        a=0
        pass
print(f)

2020/03/28 21:17

di figo

def func_d(num):
    sum = num
    for i in str(num):
        sum = sum + int(i)
    return sum

total = 0
self_number = []

for i in range(1, 5001):
    self_number.append(func_d(i))

for i in range(1, 5001):
    if i not in self_number:
        total += i

print(total)

인터넷과 유튜브로 배우는 중인 파이썬 초보자입니다 다른분의 코드를 보니 정말 엄청난 분들이 많으시네요 1~5000을 제너레이터로 해서 리스트를 하나 구성하고 1~5000까지 반복하면서 위 리스트에 없는 수의 합을 구한 초보의 코딩입니다

2020/03/31 11:24

잘해보자

파이썬 3.8.2 로 작성해보았습니다.

a = {b for b in range(1, 5001)}
b = []
for x in range(1, 5001):
    k = x
    for y in str(x):
        k += int(y)
    b.append(k)
answer = sum(a - set(b))

2020/04/01 19:45

candy GP

n = 0
s_1 = set()
s_2 = set()
_all_sum = 0

def d(n):
    _sum = 0
    for i in range(len(str(n))):
        _sum += int(str(n)[i])
    _sum += int(n)
    return _sum

for n in range(1, 5001):
    if d(n) != int(n):
        s_1.add(n)
        #print(d(n))
        s_2.add(d(n))

l_1 = list(s_1 - s_2)
l_1.sort()

for j in l_1:
    _all_sum += j

print(l_1)
print('모든 셀프 넘버의 합은 %s' %(_all_sum))

파이썬 set을 연습하는데 도움이 되었습니다.

2020/04/02 11:15

기둘비

a=[]
b=[]
sum=0
for i in range(1,5000):
    a.append(i+ i//10 + i%10)
for i in a:
    if i<=5000:
        b.append(i)
for i in b:
    sum+=i
print(sum)

2020/04/05 21:11

정민석

sn=list(range(1,5001))

for i in range (1,5000):
    summ=i
    for j in range (len(str(i))):
        summ+=int(str(i)[j])
    if summ in sn:
        sn.remove(summ)

print (sum(sn))

2020/04/06 10:43

Buckshot

<결과> 1227365 - Buckshot, 2020/04/06 10:43
            int NexNum[5000] = {0, };

            for(int i = 0 ; i < 5000 ; i++)
            {
                if(i < 10)
                {
                    NexNum[i] = i + i;
                }
                else if(i < 100)
                {
                    NexNum[i] = (i/10) + (i%10) + i; 
                }
                else if(i < 1000)
                {
                    NexNum[i] = (i/100) + ((i%100)/10) + (((i%100)/10)%10) + i;
                }
                else if(i < 10000)
                {
                    NexNum[i] = (i/1000) + ((i%1000)/100) + (((i%1000)%100)/10) + (((i%1000)%100)%10) + i;  
                }
            }

            BOOL bFlag = FALSE;
            int nSum = 0;

            for(int i = 0 ; i < 5000 ; i++)
            {
                bFlag = FALSE;

                for(int j = 0 ; j < 5000 ; j++)
                {
                    if( i == NexNum[j])
                    {
                        bFlag = TRUE;
                        break;
                    }
                }

                if(bFlag == FALSE)
                {
                    nSum += i;
                }
            }

2020/04/10 14:30

길고양이

MAXNUMBER=5000
numberList=list(range(0,MAXNUMBER+1))
selfNumberList=list(range(0,MAXNUMBER+1))
sum=0
for number in numberList:    
    if number==0:
        continue
    else:        
        strNumber=str(number)        
        if len(strNumber)==1:
            a=int(strNumber)+int(strNumber)            
            if a<=MAXNUMBER:
                selfNumberList[a]=0
        else:
            generatorNumber=0
            for cipherNumber in strNumber:
                generatorNumber+=int(cipherNumber)
            generatorNumber+=number
            if generatorNumber==0:
                pass
            elif generatorNumber<=MAXNUMBER:                
                selfNumberList[generatorNumber]=0
for o in selfNumberList:    
    sum+=o
print("self-number sum : {} ".format(sum))

파이썬으로 5000개의 숫자를 담은 리스트 2개를 만들고 처음 리스트를 이용, 숫자마다 제너레이터가 되는 숫자는 모두 0으로 바꾸면 셀프 넘버들+0으로 된 리스트만 남게 됩니다. 그 리스트의 합계를 구하면 끝.

2020/04/14 12:04

yhpdoit

generator = 0
s = set()
result = 0

for i in range(5000): 
    for j in str(i): # 각 자리의 숫자
        generator += int(j)
    generator += i

    s.add(str(generator))

    generator =  0

for i in range(5000):
     if str(i) not in s:
         result += i

print(result)

2020/04/15 20:33

ptjddn95

파이썬 처음 코드

def generator(n):
    a = n//1000
    b = (n - a*1000)//100
    c = (n - a*1000 - b*100)//10
    d = (n - a*1000 - b*100 - c*10)

    return a + b + c + d + n
result = []
self_num = []
for i in range(1,5000):
    result.append(generator(i))
result.sort()

for j in range(1,5000):
    if j not in result:
        self_num.append(j)

sum(self_num)

2020/04/22 11:58

umtitled

def d(n):
    return n + sum(int(i) for i in list(str(n)))

def sum_of_selfnumber(n):
    number_list = set(range(n+1))
    for i in range (5001):
        if d(i) in number_list :
            number_list.remove(d(i))
    return(sum(number_list))
print(sum_of_selfnumber(5000))   

2020/04/22 22:41

최민기

list_a=[]
for i in range(1,5001):
    list_a.append(i)
for i in range(1,5001):
    jeno = 0
    num=str(i)
    for j in range(len(num)):
        jeno+=int(num[j])
    jeno+=i
    if jeno in list_a:
        list_a.remove(jeno)

print(sum(list_a))



2020/04/22 23:12

kim center

def d(N):
    return sum([int(x) for x in str(N)]) + N

L = [d(i) for i in range(5000)]
print(sum(x for x in range(5000) if x not in L))

2020/04/24 13:44

YB Jung

box = []
def d(n):
    result = 0
    if len(str(n))== 1:
        result = n + n        
    elif len(str(n)) != 1:
        for a in range(1,(len(str(n))+1)):
            result = result + int(str(n)[a-1])
        result = result + n
    return result

for i in range(1,5000):
    print('d(',i,')=',d(i))
    box.append(d(i))
print(box)

box2 = list(set(range(1,5000)) - set(box))
box2.sort()
#print(box2)
#print(len(box2))

conclusion = 0
j = 0
while j < len(box2):
    conclusion = conclusion + box2[j]
    j = j + 1
print(conclusion)

중간중간에 디버그 형식으로 프린트문을 넣었습니다. 확실히 초보자라 코딩이 길어지네요.. ㅠㅠ

2020/04/25 22:11

‍임명환(학부학생/이과대학 대기과학)

a = list(range(1, 5000)) b = list() for i in range(1, 5000): num = 0 for k in str(i): num += int(k) b.append(num + int(i)) print(sum(set(a) - set(b)))

2020/04/26 22:55

SeokwonLee

def self_nums():
    generate = lambda n: sum([int(i) for i in str(n)]) + n
    generated_nums_set = set([generate(i) for i in range(5000)])
    return sum([i for i in range(1, 5000) if i not in generated_nums_set])

2020/05/08 12:23

김준혁

selfnumber = []

for i in range(1,5000):
    number = 0
    for k in range(1,5000):
        x = list(str(k))
        x.append("".join(x))
        a = list(map(int,x))
        if sum(a) == i:
            number += 1
        else:
            continue
    if number == 0:
        selfnumber.append(i)
print(selfnumber)
print(sum(selfnumber))

2020/05/10 00:59

Money_Coding

def self_num(num):
    split_num = list(map(int, list(str(num))))
    s_num = sum(split_num) + num
    return s_num

list_nums = {self_num(i) for i in range(1,5000)}

sum(set(range(1,5000))-list_nums)

2020/05/12 08:24

Dong jun Choi

# 저같은 파이썬 초보자가 보시면 이해되실만한 풀이
x = range(1, 5000)
total = 0

for i in x:
    y = range(1, i+1)
    for ii in y:
        digit_1000 = ii // 1000
        digit_100 = (ii // 100) % 10
        digit_10 = (ii // 10) % 10
        digit_1 = ii % 10

        if i == ii + digit_1 + digit_10 + digit_100 + digit_1000 :
            break

        if i == ii :
            total += i

print(total)

2020/05/12 10:59

WB

#파이썬
def selfN(n): 
    return n + sum([int(i) for i in str(n)]) # n + 각 자릿수의 합


mylist = set(range(5000)) - set([selfN(i) for i in range(5000)]) #0~5000집합 - self Number가 아닌 수들의 집합
print(sorted(list(mylist))) #집합 정렬해서 출력



2020/05/18 22:03

맛나호두

레벨2에 처음 도전한 초보자입니다. 어찌저찌 답은 나오네요^^

N=5000
self_num = [i for i in range(1,N+1)]
for i in range(1,N+1):    
    for j in range(1,i+1):
        if i == sum([int(k) for k in str(j)])+j:
            self_num.remove(i)
            break
print(sum(self_num))

2020/05/20 10:03

aryagaon

def d(n): return n+ sum([int(i) for i in str(n)])

dic = {i:True for i in range(1,5000)}

for i in range(1,5000): a = d(i) if a<5000-1: dic[a] = False

sum = 0 for key,value in dic.items(): if value:sum+=key print(sum)

2020/05/26 07:48

박일규

파이썬 왕초보입니다. 개선할 부분 알려주세요! 다른분들 코드는 logic이해가 잘 안되어서 완전 원시적인 방법으로 해보았습니다.

#제네레이터 함수
def d_generator():
    for f in range(0,5):
        for t in range(0,10):
            for s in range(0,10):
                for p in range(0,10):
                    num=1000*f+100*t+10*s+p+f+t+s+p
                    if 1<=num and num<5000:
                        if num in num_list:
                           num_list.remove(num)   #모든 자연수 리스트에서 제네레이터 삭제

#self number의 합    
def self_num_sum():
    global sum
    sum=0
    for j in range(0,len(num_list)):
        sum+=num_list[j]
    return sum


#1~5000 모든 자연수 리스트 생성   
num_list=[]
for i in range(1,5000):
    num_list.append(i)

d_generator()
print("self number list: ",num_list)   #self number 리스트
print("self number sum = ",self_num_sum())   #self number 합

2020/05/27 14:40

sjmw

num = int(input())
find_generator = []
for i in range(1,num+1):
    find_generator.append(str(i))
    for k in range(1,i):
        k_sum = 0
        k_list = list(str(k))
        number = 0
        for j in k_list:
            number += int(j)
        k_sum += k + number
        if k_sum == i:
            find_generator.pop(find_generator.index(str(k_sum)))
            break
print(sum(int(generator) for generator in find_generator))

2020/06/06 00:25

zeusrornfl

#Self_Number.py

NUM_DATA = 5000

def d(n):
    result = n
    while(n>0):
        result += n%10
        n = n//10
    return result

data = list(range(1,NUM_DATA+1))

for i in range(0,NUM_DATA):
    if(data[i]!=0):
        next = d(data[i])
        while(next <= len(data) and data[next-1] !=0):
            data[next-1] = 0
            next = d(next)

print(sum(data))

2020/06/07 19:24

Chris

sum_c = []
check_bool = True
answer_for = 0

'''
각 자릿수 숫자들과 자신을 더하기 위한 for문
int 자료형으로는 인덱스를 나눌 수 없기에 str 자료형으로 바꿔준 후 다시 int 자료형으로 바꿔서 연산해준다.
각 자릿수 숫자들은 더해준 후 자기 자신을 더해준다. 그리고 sum_c 리스트에 append 한다.
결과적으로 sum_c에는 1부터 4999까지의 제네레이터가 포함된다.
'''
for i in range(1, 5000):
    sum_check = 0
    for j in range(0, len(str(i))):
        sum_check = sum_check + int(str(i)[j])

    sum_check = sum_check + i
    sum_c.append(sum_check)


# bool 체크해서 출력하는 코딩
'''
1부터 4999까지의 숫자가 sum_c의 모든 값들을 하나하나 대조하며 같은지 아닌지를 확인하는 for문
같다면 check_bool이 True이며 같지 않다면 False를 저장한다.
그 후 check_bool이 False라면 answer_for에 i를 계속 더해간다.
결과적으로 check_for에는 제네레이터가 없는 숫자들만 더해진다.
'''
for i in range(1, 5000):
    for j in range(0, len(sum_c)):
        if sum_c[j] == i:
            check_bool = True
            break
        else:
            check_bool = False

    if check_bool == False:
        answer_for = answer_for + i

print(answer_for)

# set 자료형을 사용해서 출력하는 코딩
'''
1부터 4999까지의 숫자를 set으로 set 자료형을 만들고 sum_c를 set 자료형으로 만들어 두 집합의 여집합을 구하는 코딩이다.
answer_set에는 제네레이터가 없는 숫자들만 포함되며 sum 메서드를 사용해 각 원소들을 모두 더해주면 된다.
'''
answer_set = set(range(1, 5000)) - set(sum_c)
print(sum(answer_set))

1227365

2020/06/12 22:00

박화비

d <- function(n) {
  n_chars <- as.character(n)
  n_chars <- strsplit(n_chars, '')[[1]]
  n_nums <- as.integer(n_chars)
  return(sum(c(n_nums, n)))
}
find_self_number <- function(start, end) {
   number_all <- start:end
   ds <- c()
   for (i in number_all) {
     ds[i] <- d(i)
   }
   df <- data.frame(generator = number_all, d = ds)
   g_list <- list()
   for (i in number_all) {
     g_list[[i]] <- df[df$d == i, ]$generator
   }
   self_number <- which(vapply(g_list[number_all], length, 1) == 0)
   return(sum(self_number))
}
find_self_number(1, 4999)

2020/06/15 18:51

권석현

파이썬3입니다.

뭔가 더 줄일 수도 있을 것 같은데 복잡하게 한 느낌입니다.

어떻게하면 더 간단하게 만들 수 있을까요?

def d(n):
    x = n + eval('+'.join(str(n)))
    return x

selfNumber = set([x for x in range(1, 5000)]) - set([d(x) for x in range(1, 5000) if d(x) < 5000])
print(selfNumber)
print(f'The sum of self number  is {sum(selfNumber)}')

2020/06/16 16:07

누마루

a=range(1,5001)
b=[]
for i in a:
    if i >=1000:
        b.append(int(str(i)[0])+int(str(i)[1])+int(str(i)[2])+int(str(i)[3])+i)
    elif i>=100:
        b.append(int(str(i)[0])+int(str(i)[1])+int(str(i)[2])+i)
    elif i>=10:
        b.append(int(str(i)[0])+int(str(i)[1])+i)
    else:
        b.append(int(str(i)[0])+i)
print(sum(list(set(a)-set(b))))

2020/06/17 07:37

SREBP1c

func printSelfNumberSum() {
        var sum:Int = 0
        var generatorDic:Dictionary = [Int:Bool]()
        for i in 0..<5000 {
            generatorDic[generator(value: i)] = true
        }

        for i in 0..<5000 {
            if generatorDic[i] == nil {
                sum += i
            }
        }

        print("셀프 넘버들의 합 :\(sum)")
    }

    func generator(value:Int) -> Int {
        let valueStr = String(format:"%d", value)
        var generatedInt:Int = 0

        for i in 0..<valueStr.count {
            let objChar = Array(valueStr)[i]
            generatedInt += Int(String(objChar)) ?? 0
        }
        generatedInt += value

        return generatedInt
    }

2020/06/20 14:37

Hanwe Lee

function gene(n)
{
    var str = String(n);
    for(var i=0;i<str.length;i++)
    {
        n += parseInt(str[i]);
    }
    return n;
}

var n=5000;

var array = Array.from({length: n}, (a, i) => i+1);
for(var i=1;i<=n;i++)
{
    var piv = gene(i);
    var idx = array.indexOf(piv);
    if(idx >= 0)
    {
        array.splice(idx,1);
    }
}

2020/06/29 17:13

조서현 (아메이카)

#include<stdio.h>
int getValueByGenerator(int);

int main(void) {
    int num[5000] = { 0 };
    int haveGen[5000] = { 0 };
    int Gensum = 0, i = 0;

    for (i = 1; i <= 5000; i++)
        num[i - 1] = getValueByGenerator(i);

    for (i = 0; i < 5000; i++) {
        if (num[i] <= 5000) {
            haveGen[num[i] - 1] = 1;
        }
    }
    for (i = 0; i < 5000; i++) {
        if (haveGen[i] == 0) {
            Gensum += i + 1;
            printf("%d ", i + 1);
        }
    }
    printf("\n");
    printf("합은 : %d\n", Gensum);
    return 0;
}
int getValueByGenerator(int x) {
    return (x + x / 1000 + (x % 1000) / 100 + (x % 100) / 10 + x % 10);
}

2020/06/29 19:54

asd15187

a = []
for i in range(1,5000):
    a += [i]
for num in range(1,5000):
    string = str(num)
    b=list(string)
    result = num
    for j in b:
        result += int(j)
    if result in a:
        a.remove(result)
sum = 0
for l in a:
  sum += l
print(sum)

2020/06/30 17:08

안성빈

Python 3.8

  1. Generator를 구하는 함수와, main 함수 별도
def generator(number: int):
    return sum([int(c) for c in str(number)]) + number


def main():
    print(sum({i for i in range(1, 5000)} - {generator(j) for j in range(1, 5000)}))


if __name__ == '__main__':
    main()

  1. 한 줄로 합친 main 함수
def main():
    print(sum({i for i in range(1, 5000)} - {sum([int(c) for c in str(j)]) + j for j in range(1, 5000)}))


if __name__ == '__main__':
    main()

2020/07/03 11:04

구루마

package main

import "fmt"

func Generator(number int) int {
    // Generator 구하는 함수
    result := number

    for number > 0 {
        result += number % 10
        number /= 10
    }

    return result
}

func main() {
    var result, gen int

    numbers := make([]int, 5000) // 1 ~ 5000 저장된 Slice

    for i := 1; i <= 5000; i++ {
        // numbers에 1부터 5000까지 저장
        numbers[i-1] = i
    }

    for j := 1; j <= 5000; j++ {
        // 수의 generator를 구하고, numbers에 있으면 0으로 바꿈
        gen = Generator(j)

        if (gen <= 5000) && (gen >= 1) {
            numbers[gen-1] = 0
        }
    }

    result = 0
    for k := 1; k <= 5000; k++ {
        // Slice의 수 모두 더함
        result += numbers[k-1]
    }

    fmt.Printf("%d", result)
}

2020/07/03 12:02

구루마

generator = set()
nogenerator = set()
for i in range(1,5000):
    generator_i = i//1000 + (i%1000)//100 + (i%100)//10 + i%10 + i
    generator.add(generator_i)

for i in range(1,5000) :
    if i not in generator:
        nogenerator.add(i)
sum = 0
for i in nogenerator:
    sum += i
print (nogenerator)
print (generator)
print (sum)

sum = 1227365

2020/07/06 22:10

ARIADNE

def d(n):
    s = n
    while n > 0:
       s += n % 10
       n //= 10
    return s

a = list(range(1, 5000))
for i in range(1, 5000):
    if d(i) <= 5000:
        for j in range(len(a)):
            if a[j] == d(i):
                del a[j]
                break
print(sum(a))

2020/07/11 18:54

김요한

N = list(range(5000))
for i in range(5000):
    ok = 0
    for j in range(len(str(i))):
        ok += int(str(i)[j])
    ok += i
    try:
        N.remove(ok)
    except ValueError:
        pass
print(sum(N))

2020/07/12 23:48

BlakeLee

public class generate {
    private int a;


    public generate(int a) {
        this.a = a;
    }

    public int active() {
            int b= a/1000;
            int c = (a/100)%10;
            int d = (a/10)%10;
            int e = a%10;

        return a+b+c+d+e;
    }
}





public class main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int sum=0;
        boolean[] result = new boolean[5000];
        for(int i=1;i<=5000;i++) {
            generate num = new generate(i);

            if((num.active()>=1) &&(num.active()<=5000))
            {
                result[num.active()-1] = true;
            }
        }
        for(int i=0;i<5000;i++)
        {
            if(result[i]==false)
                {System.out.println(i+1);
                sum +=1;
                }
        }

        System.out.println("self number의 갯수는: "+ sum);
    }

}


2020/07/14 14:07

허병우

def gen(n):
    dn = 0
    for s in str(n):
        dn += int(s)
    dn += n
    return dn

s = 0
for n in range(1, 5000):
    self_num = True
    for i in range(1, n):
        if gen(i) == n:
            self_num = False
            break
    if self_num:
        # print('{} '.format(n))
        s += n
print(s)

2020/07/17 15:30

Chang-Hoon Lee

def d(n) :
    lst = str(n)
    a=0
    for i in range(0,len(lst)):
        a+=int(lst[i])
    return a+n

a=[]
for i in range(1,5001):
    if d(i) < 5000:
        a.append(d(i))
b=set(a)
c=0
for i in range(1,5000):
    if i not in b:
        c+=i
print(c)

2020/07/17 16:51

hand coder

M=list()
L=list()
for n in range(1,5000):
    M.append(sum([int(str(n)[x]) for x in range(len(str(n)))])+int(n))

for i in range(1,5000):
    if M.count(i)==0:
        L.append(i)

print(sum([i for i in L if i<5000 or i%2==0]))

2020/07/26 05:23

김병관

def asdf(number) :
  add = 0
  for i in range(len(str(number))):
    add += int(str(number)[i])
  return number + add

print(asdf(12))

answer = list(range(5000))

for i in range(5000):
  if asdf(i) in answer:
    answer.remove(asdf(i))
  else:
    pass

print(sum(answer))

2020/07/28 00:12

김재웅

import java.util.HashSet;

public class a {
    public static void main(String[] args){
        HashSet<Integer> standard = new HashSet<Integer>();
        HashSet<Integer> arr = new HashSet<Integer>();
        for(int n=1;n<5000;n++){
            standard.add(n);
            int n1 = (n/1)%10;
            int n2 = (n/10)%10;
            int n3 = (n/100)%10;
            int n4 = n/1000;
            int result = 0;
            result = n1+n2+n3+n4+n;
            if(result < 5000){
                arr.add(result);
            }
        }
        standard.removeAll(arr);
        System.out.println(standard.toString());
    }
}

2020/08/13 22:14

skio

def det(a):
    thousand = int(a/1000)
    hundred = int(a/100) - thousand*10
    ten = int(a/10) - thousand*100 - hundred *10
    one = int(a) - thousand*1000 - hundred *100 - ten*10
    result = a + thousand + hundred + ten + one
    return result
a = [] 
total = 0
for i in range(1,5000):
    if det(i) in a or det(i)>=5000:
        pass
    else:
        a.append(det(i))
    total += i 
sum=0
for j in a:
    sum += j

print(total - sum)

2020/08/16 16:18

wanna be programmer

파이썬을 사용했습니다.

# 5000보다 작은 자연수에 대해서 d(n)의 값을 구하는 함수를 만들었습니다.
def d(n):
    if 0 < n < 10:
        return 2*n
    elif 10 <= n < 100:
        return (n%10)+(n//10)+n
    elif 100 <= n < 1000:
        return (n//100)+((n%100)//10)+(n%10)+n
    elif 1000 <= n < 5000:
        return (n//1000)+((n%1000)//100)+(((n%1000)%100)//10)+(n%10)+n
    else:
        return 0

# 5000보다 작은 자연수의 d(n)의 값을 리스트로 모두 구한 뒤 집합자료형으로 만들었습니다.
# 5000보다 작은 자연수의 집합에서 제네레이터를 가진 수의 잡합을 빼서 셀프  넘버 집합을 구합니다.
# 그 후 총합을 구합니다.
total = 0
list1 = []
for num in range(1,5000):
    if d(num) != 0:
        list1.append(d(num))
result = set(range(1,5000)) - set(list1)
for number in result:
    total += number
print(total)

1227365가 나옵니다.

2020/08/18 23:48

코딩수련수련자

package test;
import java.util.*;

public class Test{
    public static void main(String[] args) {
        int digit=0;
        int sum = 0;
        ArrayList<Integer> arr = new ArrayList<>();
        for(int i = 1; i<=5000; i++)
            arr.add(i);
        for(int n = 1; n<5000; n++) {
            digit += n % 10;
            digit += n/10%10;
            digit += n/100%10;
            digit += n/1000%10;
            int d = digit + n;
            arr.remove((Integer)d);
            digit = 0;
        }
        for(int e : arr)
            sum += e;
        System.out.println(sum);
    }
}

2020/08/19 14:30

들산

non_self_num = set(sum([int(i) for i in str(gen)]) + gen for gen in range(1,5000))

final_val = sum(set(range(1,5000)) - non_self_num)

1227365

2020/08/25 13:30

Bbb Aaa

def d(n):
  add = 0
  for i in range(len(str(n))):
    add += int(str(n)[i])
  return n + add

calc = list(range(1,5000))
answer = list(range(1,5000))

for i in calc :
  if d(i) in answer:
    answer.remove(d(i))

print(sum(answer))

2020/08/28 07:15

김재웅

파이썬입니다.

selfnum=list(range(1,5000)) #셀프넘버가 담길 리스트
for G in range(1,5000):
    dn=0                         #셀프넘버가 아닌 수를 찾는 과정
    for i in range(len(str(G))):
        dn+=int(str(G)[i])
    dn+=G

    for i in range(4999) :    #셀프넘버가 담길 리스트에 셀프넘버가 아닌수를 0으로
        if selfnum[i]==dn : selfnum[i]=0 break
print(sum(selfnum))         #셀프넘버들의 합

쌩초보라 코드가 고급지지 못하네요..더 분발하겠습니다

2020/08/28 22:39

무무

has_generator = [ ]

for i in range(1, 5000):
    if i < 10:
        has_generator.append(i + i)
    elif i < 100:
        has_generator.append( i // 10 + i % 10 + i)
    elif i < 1000:
         has_generator.append(i // 100 + (i % 100) // 10 + i % 10 + i)
    elif i < 10000:
        has_generator.append(i // 1000 + (i % 1000) // 100 + ((i % 1000) % 100) // 10 + i % 10 + i)

non_gen_sum = 0

for i in range(1, 5000):
    if i not in has_generator:
        non_gen_sum = non_gen_sum + i

print(non_gen_sum)


2020/08/29 23:53

YoungJun-Ryu

"""
has_generator = [ ]

for i in range(1, 5000):
    if i < 10:
        has_generator.append(i + i)
    elif i < 100:
        has_generator.append( i // 10 + i % 10 + i)
    elif i < 1000:
         has_generator.append(i // 100 + (i % 100) // 10 + i % 10 + i)
    elif i < 10000:
        has_generator.append(i // 1000 + (i % 1000) // 100 + ((i % 1000) % 100) // 10 + i % 10 + i)

non_gen_sum = 0

for i in range(1, 5000):
    if i not in has_generator:
        non_gen_sum = non_gen_sum + i

print(non_gen_sum)
"""

def generation(n):
    num = str(n)
    num_length = len(num)

    generated_num = n

    for i in range(0, num_length):
        generated_num += int(num[i])

    return generated_num

has_generation = []
nonhas_sum = 0

for i in range(1, 5000):
    if generation(i) < 5000:
        has_generation.append(generation(i))

for i in range(1, 5000):
    if i not in has_generation:
        nonhas_sum += i

print(nonhas_sum)

2020/08/30 00:54

YoungJun-Ryu

package example01;

public class Nexon {

    public static void main(String[] args) {
        //시작한지 얼마 안돼서 단순하게 푸는것밖에 안돼네여 ㅠ
        //1~5000까지의 합에서 셀프넘버가 아닌수의 합을 빼는 코드를 짜봤습니다
        int sum=0;
        int all=0;
        int result=0;
        int n[]=new int[5000];
        for(int i=1;i<5000;i++){
            for(int a=0;a<=9;a++) {
                for(int b=0;b<=9;b++) {
                    for(int c=0;c<=9;c++) {
                        for(int d=0;d<=9;d++) {

                            if(i==a+b+c+d+((a*1000)+(b*100)+(c*10)+d)){

                                n[i]=i;

                            }

                        }   
                    }
                }
            }

        }

        for(int i=1;i<5000;i++){
            sum+=n[i]; //셀프넘버가아닌 수의 합
        }

        for(int i=1;i<5000;i++){
        all = all+=i;   //1~5000까지의 합
        }

        result=all-sum;  //셀프넘버의 합이나옴
        System.out.println(result);

    }
}

2020/09/01 17:51

뚜떱 sooyeon_surf

using System;
using System.Collections.Generic;

namespace ConsoleApp
{
    class Program
    {
        public int generatorValue(string number)
        {
            int generatorNumber = Convert.ToInt32(number);

            for (int index = 0; index < number.Length; index++)
            { 
               generatorNumber += Convert.ToInt32(number.Substring(index, 1));
            }

            return generatorNumber;
        }

        static void Main(string[] args)
        {
            Program method = new Program();

            List<int> generatorList = new List<int>();
            int selfNumber = 0;

            for(int index = 1; index<5000; index++)
            {
                int test = method.generatorValue(index.ToString());
                generatorList.Add(test);
            }

            for(int index = 1; index<5000; index++)
            {
                bool checker = generatorList.Contains(index);

                if (!checker)
                {
                    selfNumber += index;
                }
            }

            Console.WriteLine(selfNumber);
        }
    }
}

2020/09/08 13:55

김저승


public class test4 {
    public static void main(String[] args) {
        int answer = 0;

        for(int x = 1; x <= 5000; x++) {
            if(!self_number(x)) {
                answer += x;
            }
        }
        System.out.println(answer);
    }

    public static int generator(int a) {
        int result = 0;
        int temp = a;
        result += a / 1000;
        temp -= result * 1000;
        result += a / 100;
        temp -= result * 100;
        result += a / 10;
        temp -= result * 10;
        result += a;
        result += temp;

        return result;
    }

    public static boolean self_number(int a) {
        for(int i = 1 ; i <= a; i++) {
            if(generator(i) == a){
                return true;
            }
        }
        return false;
    }
}

진짜 무식하게 푼듯 ;;

2020/09/11 18:16

nazunamoe

a=[]
for i in range(1,5001):
    a.append(i)
for i in range(1,5001):
    count=0
    number=str(i)
    if j in range(1,5001):
        count += int(number[j])
    count += i
    if count in a:
        a.remove(count)
print(sum(a))

2020/09/13 17:05

갸갸

def d(num):
    ten = 10
    position = 1 # 처음에는 1의 자리 숫자이다.
    sum = num
    #최초의 숫자가 일의 자리 숫자일 경우이다.
    if(num<ten):
        return num*2

    #몇 자리 숫자인지를 판단한다.
    #여기서 10의 단위로 끊어지는 숫자일 경우 그대로 리턴해준다.
    #그게 아닐 경우에는 각 자리의 숫자들하고 더해줘야 한다.
    while(1):
        if(num<ten):
            break 
        elif(num==ten):
            return ten+1
        else:
            position += 1
            ten *= 10
    #이제 자리숫자를 구했으니 더해줘야 한다.
    ten = 10
    for i in range(position):
        if ten==10:
            change = num%ten #최초에는 1의 자리 숫자를 구함
            sum += change # 일의 자리 숫자를 더함.
            num -= change # 일의 자리 숫자 필요 없으니 빼버림
            ten *= 10
        else:
            change = num%ten
            change /= (ten/10) #이 뜻이 num이 120이라면 100나머지해서 20을 만듬. 거기에 ten이 100이니 10으로 만들고 나눔. 그러면 2가됨.
            sum += change
            num -= (num%ten)
            ten *= 10
    return sum
#위의 d함수를 요약하면.
#처음에는 10미만 인지를 확인한다. 맞으면 곱하기2해서 바로 리턴한다.
#10이상이라면 몇자리 숫자인지 확인한다.
#그중에서도 10단위로 끊어지는 숫자 ex)100,1000 같은 숫자들은 1더해주고 바로 리턴
#그게 아니라면 몇자리 숫자인지 나왔으니 자리 숫자마다 더해준다.
load = list()
selfnumber = list()
Not_selfnumber = list()
sum = 0

#일단 1~5000까지 d한 값들을 저장한다.
for i in range(1,5001):
    load.append(d(i))

#이제 1에서 부터 5000까지 숫자중에서 셀프 넘버인 숫자들을 판별한다.
#쉽게 말해서 load에 숫자가 없으면 셀프 넘버이다 .
for i in range(1,5001):
    if i not in load:
        sum += i #만약에 i숫자가 load 리스트 안에 없으면 셀프 넘버이니 그대로 더해준다.
        selfnumber.append(i)
    else:
        Not_selfnumber.append(i)
"""
#셀프 넘버들 보고 싶으며 주석 해제 하며 된다.
for i in selfnumber:
    print("selfnumber : %d"%i)

#셀프 넘버들이 아닌것.
for i in Not_selfnumber:
    print("Not_selfnumber: %d"%i)
"""
print("sum : %d"%sum)







2020/10/01 17:59

jaewook Lee

#include <iostream>
#include <string>
using namespace std;

int main() {
    bool is_self[5000];
    for (int i = 0; i < 5000; i++) {
        is_self[i] = true;
    }

    for (int n = 1;; n++) {
        int result_sum = n; // d(n)
        string string_number = to_string(n);

        for (int i = 0; i < string_number.length(); i++) {
            result_sum += string_number[i] - '0';
        }

        if (result_sum >= 5000)
            break;

        is_self[result_sum] = false;
    }

    int self_sum = 0;
    for (int i = 0; i < 5000; i++) {
        if (is_self[i] != false)
            self_sum += i;
    }

    cout << self_sum << endl;


    return 0;
}

2020/10/01 19:56

김동현

#include<stdio.h>

int main()
{
    int i,j,sum;
    for(i=1;i<=5000;i++)
    {
        for(j=1;j<i;j++)
        {
            if(i==j/1000+(j/100)%10+(j/10)%10+j%10+j)
            {
                sum += i;
                break;
            }
        }
    }

    printf("\n%d",12502500-sum);
    return 0;
}

2020/10/01 23:21

June

using System;
using System.Collections.Generic;

namespace _61일차_10월01일
{        
    class MainApp
    {
        public static int Result(int num)
        {
            char[] Array_Char = num.ToString().ToCharArray();
            int Result = 0;
            for (int i = 0; i < Array_Char.Length; i++)
            {
                Result += int.Parse(Array_Char[i].ToString());
            }

            return Result + num;
        }

        static void Main(string[] args)
        {
            List<int> Temp = new List<int>();
            for (int i = 0; i <= 5000; i++)
            {
                Temp.Add(Result(i));
            }

            List<int> Temp_2 = new List<int>();
            for (int j = 0; j <= 5000; j++)
            {
                if (Temp.Contains(j))
                    continue;
                else
                    Temp_2.Add(j);
            }

            int Total = 0;           
            for (int k = 0; k < Temp_2.Count(); k++)
            {
                Total += Temp_2[k];
            }

            Console.WriteLine($"Result : {Total}");
        }
    }
}

2020/10/02 02:36

MinSeung Kang

public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();

        int sum1 = 0, sum2 = 0;
        for(int i=1; i<5001; i++) {
            int sum = 0;
            for(int j=i; j<i+1; j++) {
                int n = j;
                sum += n+(n%10);
                while(n>9) {
                    n = n/10;
                    sum += n%10;
                }
                sum2 += i;
                if(!list.contains(sum) && sum<5001) list.add(sum);                      
            }
        }   
        for(int i : list) {
            sum1+=i;
        }
        System.out.println(sum2 - sum1);

    }

2020/10/03 20:11

B A

answer =[sum([int(i) for i in list(str(i))]) + i for i in range(1,5000) if sum([int(i) for i in list(str(i))]) + i < 5000]
print(sum(set(i for i in range(1,5000)) - set(answer)))

2020/10/13 22:15

soplia080 gyp

자바입니다.

public class Nexon {

    public static int d(int num) {
        int a = num;
        while(num/10>=0) {
            a+=num%10;
            if(num==0) {
                break;
            }
            num/=10;    
        }
        return a;
    }

    public static int g(int num) {
        int[] a = new int[num];
        int count = 0;
        for(int i=1; d(i)<=num;i++) {
            a[d(i)-1]++;
            }
        for(int i=0; i<a.length;i++) {
            if(a[i]==0) {
                count+=i+1;


            }
        }
        return count;
        }


    public static void main(String[] args) {
        System.out.println(g(5000));
    }
}

2020/10/15 11:49

ᆞᄉ

def d(n):
  sum = 0
  for i in range(len(str(n))):
    sum += int(str(n)[i])
  return n + sum

n = list(range(1,5000))
result = list(range(1, 5000))

for i in n :
    if d(i) in result :
        result.remove(d(i))

print(result)
print(sum(result))

2020/10/30 18:28

쭈쭈니

def d(number): total = number number = str(number) for i in number: total += int(i) return total

self_number_total = 0 self_number_set = set()

for i in range(1,5000): self_number_set.add(d(i))

for i in range(1,5000): if not i in self_number_set: self_number_total += i

print(self_number_total)

2020/11/03 20:07

고태욱

되긴 했는데 너무 야매로 풀었네요.. 하지만 풀이는 여러가지 방법이니까~~ ^^ 참고로 c언어입니다. cpp밖에 안보여서

#include <stdio.h>

int plus(int a) {
    int b;
    a = a + 1; //초기 a 값을 0으로 받기 때문에 1을 더해줬다.
    b = a % 10 + (a / 1000) + (a % 1000) / 100 + (a % 100) / 10 + a; //제너레이터 수 구하는 식

    return b;
} 




int main(void) {

    int gener[5000] = { 0 }; // 제너레이터 전용 배열
    int self[5000] = { 0 }; // 셀프 넘버용 배열
    int c = 0; //판독전용 변수
    int sum = 0; //덧셈용

    for (int i = 0; i < 5000;i++) {
        gener[i] = plus(i); //배열 gener[0] ~gener[4999]의 배열에 각각 1~5000까지 수 대입

    }
    for (int i = 0; i < 5000;i++) {
        for (int v = 0; v < 5000; v++) {
            if (i != gener[v]) //  1일때 gener[0]~gener[4999]까지 비교하고 이 수가 없으면 판독전용 함수에 1씩 더해라.
                c += 1; 
        }
        if (c == 5000) { // 만약에 이 판독 전용함수가 5000이면 i의 수는 gener[0~4999]까지 겹치는게 없음으로 그 수는 셀프넘버이다.
            self[i] = i;  //만약 하나라도 겹친다면 4999값이 나오므로 아래 문장은 실행되지 않는다.
            sum += self[i]; //셀프넘버 덧셈
            printf("%d\n", self[i]); //그리고 셀프넘버를 출력
        }
        c = 0; // 다시 c값을 0으로 초기화 시켜주어 for 문으로 들어갔을때 4999 or 5000 값만 반환.
    }
    printf("%d", sum);


    return 0;
}


2020/11/10 21:26

gree Yu

class countSelfNumber:
    def __init__(self):
        self.sum = 0
    def doCounting(self,n):
        b = []
        for i in range(1,n+1):
            b.append(i)
        for i in range(1,n+1):
            d = i+self.sum_digit(i)
            try:
                b.remove(d)
            except:
                pass
        self.sum = sum(b)
        print(self.sum)
    def sum_digit(self,number):
        return sum([int(i) for i in str(number)])

a = countSelfNumber()
a.doCounting(5000)

2020/11/14 15:18

footsize

f = [eval("+".join(str(i))) + int(i) for i in range(1, 5000)]
result = sum([i for i in range(1, 5000) if i not in f])
print(result)

2020/11/23 16:02

김우석

def genor(n):
    t = 0
    for i in str(n):
        t += int(i)
    t += int(n)

    return t

res1 = set()
res2 = set(range(1, 5001))
for i in range(5000):
    res1.add(genor(i))

print(sum(res2-res1))

2020/11/27 07:05

안상원

def self(num):
    temp = int(num)
    _sum = 0
    result = []
    for i in range(temp):
        _sum += sum([int(a) for a in str(i)])
        if _sum + i == temp:
            result.append(i)
        _sum = 0
    return result

result1 = []
for i in range(1,5000):
    if len(self(i)) == 0:
        result1.append(i)
print(sum(result1))

2020/11/27 08:51

DSHIN

파이썬이에요

list_a = []
list_b = []
for i in range(1, 5000):
  list_a.append(i)
  list_b.append(sum([int(x) for x in (str(i))]) + i)

print (sum(set(list_a) - set(list_b)))

2020/11/28 19:40

코딩초딩

#include <iostream>
#include <vector>

using namespace std;

int d(int num);

int main() {
    int num=1;
    vector<int> group;
    group.push_back(-1);
    while (true) {
        for(int j = 0; j<group.size();j++) {
            if(group[j]==d(num)) {
                break;
            }
            if (j==group.size()-1) {
                group.push_back(d(num));
            }
        }
        num++;
        if (d(num)==5000) {
            break;
        }
    }
    int sum1=0;
    int sum2=0;
    for(int i=0;i<5000;i++) {
        sum1+=i;
    }
    for(int i =1;i<group.size();i++) {
        sum2+=group[i];
    }
    cout << sum1 << "\t" << sum2 << endl;
    cout << sum1-sum2 << endl;
    return 0;
}

int d(int num) {
    int _num = num;
    int sum=0;
    int tmp;
    while (num>0) {
        tmp = num%10;
        sum +=tmp;
        if (num<10) {
            break;
        }
        num = num/10;
    }
    sum += _num;
    return sum;
}






2020/12/06 00:23

배민준

lst = list(range(1,5000))
def generator(a) :
    str_a = str(a)
    for i in range(len(str_a)) :
        a = a + int(str_a[i])
    return a

k = 0

while True :
    k = k + 1
    value = generator(k)
    if value < 5000 :
        if value in lst :
            lst.remove(value)
        else :
            continue
    else :
        break
Sum = 0
for i in lst :
    Sum = Sum + i
print(Sum)

2020/12/06 00:32

Centro

def d(n):

  num=int(n)

  for i in range(0,len(n),1):

    num+=int(n[i])

  return num

for_answer=[]

for i in range(1,5001,1):

  for_answer.append(i)

for j in range(1,5001,1):

  if int(d(str(j))) in for_answer:

    for_answer.remove(d(str(j)))

print(for_answer)

answer=0

for i in for_answer:

   answer+=i

print(answer)

2020/12/11 16:18

전준혁

import java.util.ArrayList;

public class gener {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a=0, b=0, c=0, d=0;
        int re=0;
        ArrayList<Integer> selfnum = new ArrayList<>();
        for(int i=0; i<5000; i++) {
            a=i%10;
            b=i/10%10;
            c=i/100%10;
            d=i/1000;
            re=a+b+c+d+i;

            if(re>=1 && re<=5000)
                selfnum.add(re);
        }
        int sum=0;
        for(int i=0; i<5000; i++) {
            if(!selfnum.contains(i))
                sum+=i;
        }
        System.out.println("총합은 : "+ sum);
    }

}

2020/12/14 21:14

이정섭

import java.util.HashSet;
import java.util.Iterator;


public class SelfNumberFinder {
    public static void main(String arg[]) {
        int limit = 5000; // 1에서 5000사이의 self-number를 찾는 프로그램이다.

        HashSet<Integer> set = new HashSet<Integer>();
        HashSet<Integer> set_check = new HashSet<Integer>(limit); // 1부터 5000까지의 수를 저장할 set     

        for(int nat_num = 1; nat_num <= limit; nat_num++) {

            int num = nat_num;
            int sum = 0;
            while(num!=0) {
                sum += num%10; //num을 10으로 나눈 값을 더해서 sum에 저장
                num /= 10; //num은 10으로 나눈 몫으로 초기화.
            }

            set_check.add(nat_num); // 1부터 5000까지의 값을 hashset에 저장.
            set.add(nat_num + sum); // HashSet set에 값 저장.
        }
        set_check.removeAll(set); // 차집합의 결과가 곧 1부터 5000까지의 자연수 중 self number
        Iterator iter = set_check.iterator(); // Iterator iter선언.
        int result_sum = 0;
        while(iter.hasNext()) { 
            int temp = (Integer)iter.next();
            System.out.println(temp);
            result_sum += temp;
        }
        System.out.println(result_sum);
    }   
}

2020/12/16 17:28

최승현

def generated_num(num):
    result = sum(list(map(int, str(num)))) + num
    return result


generated_nums = []
for i in range(1, 5000):
    a = generated_num(i)
    if a < 5000:
        generated_nums.append(a)

self_nums = list(set(list(range(1, 5000))) - set(generated_nums))
print(sum(self_nums))

파이썬으로 작성하였습니다.

(1) 5000 미만의 d(n)의 리스트를 만들고

(2) 1이상 5000미만의 자연수 리스트를 만들어

(3) (2)에서 (1)의 공통부분을 제거하는 차집합 연산 후 다시 리스트로 바꾸어

(4) (3)의 각 요소의 합을 구하였습니다.

정답은 1227365 입니다

2020/12/18 21:54

임준혁

selfNum = []

for a in range(1,5000):
    if len(str(a)) == 1:
        selfNum.append(a+a)
    elif len(str(a)) == 2:
        selfNum.append(int(str(a)[0])+int(str(a)[1])+a)
    elif len(str(a)) == 3:
        selfNum.append(int(str(a)[0])+int(str(a)[1])+int(str(a)[2])+a)
    elif len(str(a)) == 4:
        selfNum.append(int(str(a)[0])+int(str(a)[1])+int(str(a)[2])+int(str(a)[3])+a)

print(sum(selfNum))

실력이 안돼서 삽질하는 코드밖에..ㅜㅜ

2020/12/21 21:43

이진원

def d(n):
    n = str(n)
    SUM = 0
    for i in n:
        SUM += int(i)
    return int(n) + SUM
result = []
for i in range(1,4976):
    result.append(d(i))
s1 = set(sorted(result))
s2 = set(range(1,5000))
print(sum(s2 - s1))

4975는 5000의 제네레이터 이므로 4975까지 루프를 돌렸습니다.

2020/12/26 19:48

guma go

#generator
number = [] #제네레이터가 있는 숫자들의 리스트
for i in range(1, 5001):
    if i>=1 and i<10:
        c = i*2
        if c <= 5000:
            number.append(c)

    if i>=10 and i<100:
        b = str(i)
        b = "/".join(b)
        b = b.split("/")
        c = int(b[0]) + int(b[1]) + i
        if c <= 5000:
            number.append(c)

    if i>=100 and i<1000:
        b = str(i)
        b = "/".join(b)
        b = b.split("/")
        c = int(b[0]) + int(b[1]) + int(b[2]) + i
        if c <= 5000:
            number.append(c)

    if i>=1000 and i<5001:
        b = str(i)
        b = "/".join(b)
        b = b.split("/")
        c = int(b[0]) + int(b[1]) + int(b[2]) + int(b[3]) + i
        if c <= 5000:
            number.append(c)

sum = 0
for i in range(1,5001):
    sum+=i

has_gen = 0
for i in set(number):
    has_gen += i

self_number_sum = sum - has_gen
print(self_number_sum)

저는 초보라서 위의 분들처럼 멋있고 간략하게 못만들었네요ㅠㅠ 일단 제가 아는 지식들만 활용해서 만들어보았습니다. 위에서부터 1에서 5000까지의 수를 자릿수 별로 분류해서 10의 자릿수, 100의 자릿수, 1000의 자릿수 별로 나눠서 계산하였습니다. 반복문을 통하여 1부터 계산하는데 이를테면 128이면 split을 이용해 1과 2와 8로 나워주고 128을 더해 제네레이터를 가지는 수들만 색출하여 number리스트에 담아줬습니다. 그런데 제가 처음에 간과했던점은 저렇게 구하면 중복이 나올수도 있다는 점입니다. 따라서 set함수를 통해 중복을 제거해준 후 전체 1부터 5000까지의 합에서 제네레이터를 가지는 수들의 합만 빼주면 답인 1227365가 나오게됩니다.

부족하지만 봐주셔서 감사합니다!

2020/12/27 16:16

Mount

def generator():
    g = []
    for i in range(10):
        for j in range(10):
            for k in range(10):
                for l in range(10):
                    value = 1001*i+101*j+11*k+2*l
                    if value <=5000:
                        g.append(1001*i+101*j+11*k+2*l)
                    else :
                        break
    result = [x for x in range(1,5001) if x not in g]
    return sum(result)
generator()

2020/12/27 20:45

hankyu

def d(n):
    div = list(str(n))
    num = len(div)

    for i in range(0, num):
        div.insert(2 * i + 1, '+')
    div.append(str(n))
    return eval(''.join(div))

s1 = set()
s2 = set()

for i in range(1, 5000):
    s1.add(i)

for i in range(1,5000):
    s2.add(d(i))

s3 = s1 - s2
li = list(s3)
num = len(li)
result = 0

for i in range(num):
    result = result + li[i]
print(result)

추천이 높으신 분의 코드를 참고하여 수정해봤습니다.

def d(n):
    return sum(int(i) for i in str(n))+n

s1 = set(range(1,5000))
s2 = set(d(i) for i in range(1,5000))

print(sum(s1 - s2))

2020/12/28 02:30

CHAT

import java.util.Scanner;

public class HelloWorld {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int d=s.nextInt();
        int result=0;

        System.out.print("d("+d+") =");
        for (int i=10000; i>1; i/=10) {
            result = result + (d%i)/(i/10);
            System.out.print((d%i)/(i/10));
            if(i>10)
            System.out.print(" + ");
        }
        System.out.print(" + "+ d+ " = " +(d+result));
    }

}

2020/12/31 02:48

김민수

def SelfNum(): total = list(range(1,5000)) a = [] b = [] for i in total: ma = i while ma>1: a.append(int(ma)) ma /= 10 if sum(a) >= 5000: pass else: b.append(sum(a)) b = set(b) b = list(b) result = sum(total) - sum(b) return result

def SelfNum():
    total = list(range(1,5000))
    a = []
    b = []
    for i in total:
        ma = i
        while ma>1:
            a.append(int(ma))
            ma /= 10
        if sum(a) >= 5000:
            pass
        else:
            b.append(sum(a))
    b = set(b)
    b = list(b)
    result = sum(total) - sum(b)
    return result

2021/01/07 15:33

Eun Sang Cho

def funcD(num):
    retval = num
    while num>0:
        retval += num%10
        num = int(num/10)
    return retval

setDN = set()
sumSN = 0
for n in range(1, 5000):
    if n not in setDN:
        sumSN += n
    setDN.add(funcD(n))
print(sumSN)

답은 1227365 입니다

2021/01/08 16:43

김준우

def d(number):
    for i in str(number):
        i=int(i)
        number=number+i
    return number
sum=0
for i in range(1,5001):
    a=['O' if d(u)==i else 'X'for u in range(1,5001)]
    b=a.count('O')
    if b==0:
        sum=sum+i
print(sum)



2021/01/09 18:34

dong hoon

total = sum(range(1, 5000))

lst = []
for n in range(1, 5000):
    sum = 0
    for i in str(n):
        sum += int(i)
    lst.append(n + sum)

sum = 0
for num in set(lst):
    if num < 5000:
        sum += num

print(total - sum)
1227365

2021/01/15 13:20

히구

sum(set(range(5000))-set(x+eval('+'.join(str(x))) for x in range(5000)))

2021/01/19 17:15

손우민

def gen(self):
    a = []
    b = self
    while self != 0:
        a.append(self % 10)
        self = int(self / 10)
    return sum(a) + b

a = set(range(1, 5000))
b = set({})
for i in range(1, 5000):
    b.add(gen(i))

print(sum(a-b))

2021/01/20 13:22

김민수

alll = []

for i in range(1,10):
    a = str(i)
    q = int(a[len(a)-1])+i
    alll.append(q)

for i in range(10,100):
    a = str(i)
    q = int(a[len(a)-2])+int(a[len(a)-1])+i
    alll.append(q)

for i in range(100,1000):
    a = str(i)
    q = int(a[len(a)-3])+int(a[len(a)-2])+int(a[len(a)-1])+i
    alll.append(q)

for i in range(1000,5000):
    a = str(i)
    q = int(a[len(a)-4])+int(a[len(a)-3])+int(a[len(a)-2])+int(a[len(a)-1])+i
    alll.append(q)




print(sum(set(range(1,5000))-set(alll)))

2021/01/20 22:43

fox.j

자바로 짜봤습니당

public static void main(String[] args) {
        boolean[] flag = new boolean[5000];
        Arrays.fill(flag, false);
        int answer = 0;

        for(int i=0, dNum = d(i); i<5000 && dNum < 5000 ; ++i,dNum = d(i))      flag[dNum] = true;       
        for(int i=0;i<5000;i++) if(!flag[i]) answer += i;
        System.out.println(answer);
    }

    public static int d(int n) {
        int ans = n;
        for(int i = n;i!=0;i /= 10) ans += i % 10;
        return ans;
    }

2021/01/31 13:42

sh l

def generator(n):
    total = n
    for i in str(n):
        total += int(i)
    return total

print(sum(set(range(1, 5000)) - set([generator(i) for i in range(1, 5000)])))

2021/01/31 16:45

Ha

#include <stdio.h>

int remain(int n)
{
    int tmp = n;
    int sum = 0;
    while(n != 0)
    {
        sum += n % 10;
        n /= 10;
    }
    return tmp + sum;
}
int main()
{
    int arr[5010] = {0, };
    int sum = 0;
    for(int i = 1; remain(i) < 5010; i++)
    {
        arr[remain(i)] = 1;
    }
    for(int i = 0; i < 5009; i++)
    {
        if(arr[i] != 1)
        {
            sum += i;
            printf("%d\n", i);
        }
    }
    printf("%d", sum);
}

c언어 입니다

2021/01/31 22:55

dae wan

def generator(n):
    thouthn = n//1000
    hundread = (n % 1000)//100
    ten = (n % 100) // 10
    one = (n % 10) // 1
    return n + thouthn + hundread + ten + one
n_list = list(range(1,5001))
value_list=[]
for i in n_list:
    value = generator(i)
    value_list.append(value)
# value_list.sort()
count = {}

for i in value_list:
    try: count[i] +=1
    except: count[i] = 1

uniqe = []
for i in count:
    if count.get(i) == 1:
        uniqe.append(i)
    else:
        pass

print(sum(uniqe))

2021/02/02 14:08

kukuku kikiki

def generator(n):
    n = str(n)
    for i in n:
        d = int(n)+sum(map(int,n))
    return d

i = 0; d = 0
ll = {x:x for x in range(1,5000)}

while d < 5000:
    i = i+1
    d = generator(i)
    if d in ll:
        del ll[d]
print(sum(ll))

2021/02/09 14:59

서해원

def generator(n):
    n = str(n)
    for i in n:
        d = int(n)+sum(map(int,n))
    return d

i = 0; d = 0
ll = set(x for x in range(1,5000))
while d < 5000:
    i = i+1
    d = generator(i)
    ll = ll-{d}
print(sum(ll))

2021/02/09 15:30

서해원

a=list(range(1,5000))
a2=a
y=set()
for i in a:
    x=" ".join(str(i))
    if sum(map(int,(x.split())))+i<5000:
        y.add(sum(map(int,(x.split())))+i) 

print(sum(a)-sum(y))  

2021/02/11 22:18

hexagonrose

#넥슨 입사문제 중에서

def gen(n):
    a=str(n)
    digit=[]
    for x in a:
        digit.append(int(x))
    return sum(digit)+n

result=[]
self_result=[]

for i in range(5000):
    result.append(gen(i))

for num in range(5000):
    if num not in result:
        self_result.append(num)

print(sum(self_result))

2021/02/18 18:23

최우진

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int sum=0, Num=0;
    bool Array[5001]={0, };
    for(int i=1; i<5001; i++)
    {
        for(int j=0; j<4; j++)
        {
            Num += ((int)(i/pow(10, j))%10);
        }
        Num += i;
        if(Num<5001)
            Array[Num] = 1;
        if(Array[i]==0)
            sum+=i;
        Num=0;
    }

    for (int i=1; i<5001; i++)
    {

    }
    cout<<sum<<endl;
    return 0;
}

코린이 코딩해봤습니다.. 평가부탁드려요

2021/02/18 22:31

JM

def generator(n) :
    result = 0
    for i in str(n) :
        result += int(i)
    result += n
    return result

def findgenerator(n):
    generatorresult = []
    for i in range(n):
        if generator(int(i)) == n:
            generatorresult.append(i)

    if generatorresult == []:
        return n
    else:
        return generatorresult


def reader(n):
    if findgenerator(n) == n:
        return n
    else:
        return 0

result = 0
for i in range(1,5001):
    result += reader(i)

print(result)

2021/02/20 01:15

­장태호 / 학생 / 원자핵공학과

#include <stdio.h>

int arr[5001];

int cal(int n)
{
    int result;

    int ten = n % 10;
    int hun = (n % 100) / 10;
    int thou = (n % 1000) / 100;
    int ten_thou = (n % 10000) / 1000;
    result = n + ten_thou + thou + hun + ten;

    return result;
}

int main()
{
    int i;
    for (i = 1; i <= 5000; i++) 
    {
        if (cal(i) < 5001)
        {
            int target = cal(i);
            arr[target]++;
        }
    }

    int sum = 0;
    for (int i = 1; i <= 5000; i++)
    {
        if (arr[i] == 0)
            sum += i;
    }
    printf("%d\n", sum);
    return 0;
}


2021/02/20 02:02

다흡

python 3.9.1입니다.

def d(n):
    nstr = str(n)
    nstr = ' '.join(nstr)
    nlist = nstr.split(' ')
    nlist = [int(num) for num in nlist]
    return sum(nlist, n)
numset = set(range(1, 5001))
dset = set()
for i in range(1, 5001):
    dset.add(d(i))
print(sum(numset - dset))

답은 다음과 같습니다.

1227365

2021/02/20 09:05

이준우

def d(n):
    output = n
    for x in str(n):
        output += int(x)
    return output

set1 = {x for x in range(1, 5000)}
set2 = {d(x) for x in range(1, 5000)}

output = sum(set1 - set2)
print(output)

2021/02/24 18:03

asdfa

#include <stdio.h>

int getResultByGenerator(int); // 제너레이터를 갖는 값을 얻음
int x, i, cnt, result;
int ValueByGeverator[5000];


int main() {
    for (i = 1; i <= 5000; ++i){
        cnt = getResultByGenerator(i); // 제너레이터를 갖는 값을 얻어 배열에 저장
        if (cnt <= 5000)
            ValueByGeverator[cnt - 1] = cnt;
    }
    for (i = 0; i < 5000; ++i) // SelfNumber 출력 및 result에 저장
        if (ValueByGeverator[i] == 0) {
            result += (i + 1);
            printf("Self-Number : %d\n", i + 1);
        }
    printf("%d", result);

    return 0;
}

int getResultByGenerator(int x) {
    return (x + x / 1000 + (x % 1000) / 100 + (x % 100) / 10 + x % 10);
}

C언어로 작성 다른 풀이를 참고했습니다.

2021/03/02 12:30

argo

def findExp(n):
    i = n
    exp = 0
    while i % 10 == 0:
        i /= 10
        exp += 1
    return exp


N = set()
n = 0

for i in range(1, 5000):
    n += 2 - 9 * findExp(i)
    if n < 5000:
        N.add(n)

print(sum(range(1, 5000)) - sum(N))

2021/03/11 18:17

Seojin Yoon

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int* arr;

void delete(int idx)

{
     memmove(arr+idx,arr+idx+1,(4999-idx)*sizeof(int)); // arr[idx+1] 부터 arr[4999] 까지 arr[idx]로 덮어쓴다.
}

int main(void) {

    int i, rel, a, b, c, d, sum;

    arr = (int*)malloc(sizeof(int)*5000); // 배열 동적할당.

    for(i=0; i<4999; i++){  // 배열에 값 집어넣기
        arr[i] = i+1;
    }

    for(a=0; a<=4; a++){
        for(b=0; b<=9; b++){
            for(c=0; c<=9; c++){
                for(d=0; d<=9; d++){
                    rel = a+b+c+d+a*1000+b*100+c*10+d;  // 제네레이터인 값들

                    for(i=0; i<5000; i++){  // 제네레이터인 값을 배열에서 빼준다.
                        if(arr[i] == rel) {
                            delete(i);

                        }
                    }
                }
            }
        }
    }

    sum = 0;
    for(i=0; i<4999; i++){
            sum = sum + arr[i];  // 셀프 넘버만 남은 배열을 다 더해준다.
    }

    printf("%d", sum); // 결과도출


}


동적 배열도 하려고했었는데 도중에 값이 그냥 나올꺼같아서 했읍니다. 그런데 풀이를 보니 다들 간결하고 이쁘게 짜셧네요... ㅠㅠ 내 코드보면서 자괴감이... 한 수 배워갑니다!

2021/03/12 20:57

모아민

def d(n):
    dn = 0
    listn = list(str(n))
    for i in listn:
        dn +=  int(i)
    dn+=n
    return dn

def Is_self_num(n):
    flag=0
    for i in range(1,n):
        if d(i)==n:
            flag=1
    return flag

result =0

for i in range(1,5000):
    if Is_self_num(i)==0:
        print(i)
        result +=i

print(result)

합:1227365```{.python} def d(n): dn = 0 listn = list(str(n)) for i in listn: dn += int(i) dn+=n return dn

def Is_self_num(n): flag=0 for i in range(1,n): if d(i)==n: flag=1 return flag

result =0

for i in range(1,5000): if Is_self_num(i)==0: print(i) result +=i

print(result) ``` 합:1227365

2021/03/17 18:14

HWASET

sum(set(list(range(1, 5000))) - set([num + sum(int(x) for x in str(num)) for num in range(1, 5000)]))

1227365

<파이썬 3> [풀이] sum(1~5000까지의 모든 집합 - 1~5000까지의 제너레이터 집합)

2021/04/04 16:11

Ruo Lee

D_list = list(range(0, 5000))
for d in range(0, 5):
    for c in range(0, 10):
        for b in range(0, 10):
            for a in range(0, 10):
                D = 2*a + 11*b + 101*c + 1001*d
                if D in D_list:
                    D_list.remove(D)
print(sum(D_list))

2021/04/06 00:22

hezuk

console.log("hello");

2021/04/12 11:50

우아한애자일

def d(n): #n은 d(n)의 제너레이터...
    s = 0 #합계
    ls = list(str(n)) #입력된 n을 분리 ex: 91->['9','1']
    for x in ls:
        s += int(x) #정수형으로 변환 후 합산
    return s + n

m = set({}) #5000까지의 제너레이터 합산
for x in range(1,5000):
    m.add(d(x)) #추가

n = set(range(1,5000)) #5000까지 모든 수

#결과출력
print(sum(n-m))

1227365

2021/04/15 16:58

김과장

gen_num = set()
for i in range(1,5001):
    sum_ = i
    for n in str(i):
        sum_  += int(n)
    gen_num.add(sum_)

set_ = set(range(1,5001))
print(sum(set_ - gen_num))

2021/04/19 14:27

임동열

def makeNum(n):
    return sum([int(char) for char in str(n)]) + int(n)


list1 = [i for i in range(1,5001)]

for j in range(1,5001):
    tmp1 = makeNum(j)
    try:
        list1.remove(tmp1)
    except:
        pass

print(sum(list1))

결과 : 1227365

2021/04/20 15:05

와장창

def generator_a(no):
    list_no=list(str(no))
    sum_1 = 0 
    for i in list_no:
        sum_1 = sum_1+int(i)
    return sum_1+int(no)

out_list=[]
for i in range(1,5000):
    out_list.append(generator_a(i))

final_sum=0
for i in range(1,5000):
    if i not in set(out_list):
        final_sum += i

print(final_sum)

2021/04/27 14:33

최태호

#5000보다 작은 셀프넘버 -> 5000보다 작은 제네레이터만 생각하면 됨
is_generator = set()           #제네레이터가 있는 수들의 집합
for n in range(1,5000):     #n은 제네레이터
    tot = n                 #합
    n = str(n)
    for number in n:        #number는 n의 각 자리수(문자)
        tot+=int(number)
    is_generator.add(tot)   #generator로 만들어진 수를 집합에 추가

result = set(range(1,5000)) - is_generator
print(sorted(result))       #셀프넘버들 확인
print(sum(result))          #총합

2021/04/28 01:34

illus

def generator(n):
    n4 = (n//1000)
    n3 = (n - (n4*1000))//100
    n2 = (n - (n4*1000) -(n3*100))//10
    n1 = n - (n4*1000) -(n3*100) - (n2*10) 
    gn = int(n4) + int(n3) + int(n2) + int(n1) + n
    return gn

num=int(input('수를 입력하세요.: '))
num_set = [int(i) for i in range(1,5000)]
generator_set = [int(generator(n)) for n in range(num)] #제너레이터 값 세트
self_number = list(set(num_set) - set(generator_set))
print(sum(self_number))

2021/04/29 14:12

bravesong

import java.util.ArrayList;

public class SelfNumber {
    public static int generator(int num) {
        int gen = 0;    //generator값
        int initNum = num;  //기준값
        int remain;         //나머지
        int n = (int)Math.log10(num);   //자리수

        //n자리수를 10으로 나누면서 각 자리수의 값을 더함
        for(int j = 0; j < n; j++) {    //자리수만큼 루프
            remain = initNum % 10;      
            initNum /= 10;              //나누어줌
            gen += remain;              //자리수 더하기
        }
        gen += num + initNum;   //가장 큰 자리수 더하기
        return gen;
    }


    public static void main(String[] args) {
        //generator 배열 , selfNum 배열 초기화
        ArrayList<Integer> arrayGen = new ArrayList<Integer>();
        ArrayList<Integer> arraySelfNum = new ArrayList<Integer>();

        //1 ~ 5000까지 generator값들의 배열
        int i = 0;
        do {
            i++;
            arrayGen.add(generator(i));
        }while(arrayGen.get(i-1) < 5000);   

        //1~5000 자연수의 배열
        for(i = 1; i < 5000; i++)   
            arraySelfNum.add(i);


        //자연수 배열에서 gen 배열값을 빼면 1~5000까지 selfNum의 배열이 된다.
        arraySelfNum.removeAll(arrayGen);   

        //selfNum 배열의 합
        int sumSelfNum = 0;
        for( int s : arraySelfNum) {
            sumSelfNum += s;
        }

        //출력
        System.out.println(sumSelfNum);

    }


}

2021/05/07 16:26

elitekid

def d(n):
    sum = eval('+'.join(i for i in str(n)))
    return sum + n

print(sum(list(range(1,5001))) - sum([d(i) for i in range(1,5001) if d(i)<=5000]))

2021/05/09 23:22

ss2663

ist_a=list(range(1,5001))

def gen_find(n):
    _num=n+sum(int(x) for x in str(n) )
    return _num

for i in range(1,5001):
    if gen_find(i) in list_a:
        list_a.remove(gen_find(i))


print(sum(list_a))

아직 미숙하게 되네요, 우선 앞에 조건인 1-5000을 만들어내기 위한 최소의 수를 계산해서 5000보다 적게 돌려 보려고 했는데 그건 좀 어려운거 같아서 우선 5000까지 다 돌렸습니다.

2021/05/16 18:24

전준혁

li=[]
n=0
num=0
num2=0

while n<=5000:
    n=str(n)
    for i in range(0,len(n)):
        num+=int(n[i])
    n=int(n)
    num+=n
    li.append(num)
    n+=1
    num=0

for i in range(1,5001):
    if i not in li:
        num2+=i

print(num2)

2021/05/24 02:57

dry


def d(n) :
    l = []
    for i in str(n):
        l.append(int(i))
    return sum(l) + n

n = set()
g = set()

for i in range(1,5000):
    n.add(i)
    g.add(d(i))

selfnum = sum(n-g)

print(selfnum)

2021/05/24 14:16

약사의혼자말

def d(num):
  result = 0
  for i in str(num):
    x = int(num)
    result += int(i)
  result += x
  return result



a = set(d(n) for n in range(5000))
b = set (range(5000))
print(sum(b - a))

2수정

2021/05/26 01:03

jaesik

public class SelfNumber {

public static void main(String[] args) {
    // 1~5000 까지
    // generator 로 돌려서 각 값을 배열에 저장
    // 그중 1~5000과 일치하지 않는 수를 골라낸다
    // int 를 나눌 경우 소수점 이하는 계산에서 무시되므로 int를 사용

    Integer a,b,c,d,result,sum=0;

    boolean[] generated = new boolean[5000];

    for(int generator=1; generator<5000;generator++){
        a = generator/1000;
        b = (generator/100)%10;
        c = (generator/10)%10;
        d = generator%10;

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

        if((result>=1)&&(result<5000)){
            generated[result] = true;
        }
    }

    for(int i=1; i<5000; i++){
        if(generated[i]==false){
            sum = sum + i;
        }
    }

    System.out.println("Self-Number의 합계는 : " + sum);

}

}

2021/05/28 21:27

니나노

#1~5000까지 총합
total = set(range(1, 5000))
#self number구하는 식
def d(number): 
    sum = number
    number = str(number)
    for val in number:
        sum += int(val)
    return sum
#1~5000까지 총합 - self number 총합 = non self number의 총합
self_number = set()
for val in range(1, 5000):
    self_number.add(d(val))
    sum(self_number)

print(sum(total - self_number))

2021/06/19 23:11

darlim

def gener(number):
    n = number
    for i in str(number):
        n += int(i)
    return n
numbers = set(range(1,5001))
generator = set(gener(i) for i in range(1,5001))
sum(numbers - generator)

2021/07/04 18:59

이원희

c = list(range(5001))
for i in range(1,5001) :
    a = str(i)
    b = 0
    for j in range(0,len(a)) :
        b += int(a[j])
    if b+i in c :
        c.remove(b+i)
print(sum(c))

2021/07/11 15:31

김성호

#codingdojing_nexon_self number_re

self_set = set()

for num in range(1, 5000):
    self_set.add(sum([int(i) for i in str(num)],num ))

sum_self = 0

for num in range(1, 5000):
    if num not in self_set:
        sum_self += num

print(sum_self) #1227365

##### refer other's solution

print(sum(set(range(1, 5000)) - {num + sum(int(i) for i in str(num)) for num in range(1, 5000)})) ## comprehesion

2021/07/18 18:00

Jaeman Lee

A=set(range(5000))
B=set(sum(map(int, str(n)))+n for n in range(5000))
print(sum(A-B))

2021/07/23 14:10

김용왕

파이썬 3.8.10으로 작성했습니다.

정답은 : 1227365 입니다.

import functools


def generator(n):
    result = functools.reduce(lambda x, y: str(int(x) + int(y)), str(n))
    return int(result) + n


def main():

    gen_dict = {}
    self_number = []

    for i in range(5000):
        number = generator(i)
        gen_dict[number] = i
    for i in range(1, 5000):
        if i not in gen_dict:
            self_number.append(i)

    print(sum(self_number))


if __name__ == '__main__':
    main()

2021/07/29 13:26

baek choi

package loop;

public class Ex09 {

    public static void main(String[] args) {

        boolean [] bl = new boolean[5001]; 

        for(int i = 1; i < 5001; i++) {
            int self = d(i);

            if (self < 5001) {
                bl[self] = true;
            }
        }

        StringBuilder sb = new StringBuilder();

        for(int i = 1; i<5001; i++) {
            if(!bl[i]) {
                sb.append(i).append('\n');
            }
        }
        System.out.println(sb);

    }

    private static int d(int number) {
        // TODO Auto-generated method stub
        int sum = number;

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

java

2021/08/11 23:09

전채

def d(n):
    A = str(n)
    B = n
    for i in A:
        B += int(i)
    return B

C = list(range(1, 5000))
for m in range(1, 5000):
    if d(m) <5000:
        try:
            C.remove(d(m))
        except ValueError:
            pass

result = 0
for o in C:
    result += o

print(result)

2021/08/15 19:16

trim39r

파이썬으로 작성했습니다.

list = []
for i in range(1,5000):
    list.append(i + sum([int(x) for x in str(i)]))
result = sum(set(range(1,5000)) - set(list))
print(result)

코드리뷰 부탁드립니다. 감사합니다.

2021/08/16 03:42

브로킴

package justStudying;

public class test2_20210816 {

    public static boolean[] b = new boolean[5001];

    public static void solution(int input) {
        String s = Integer.toString(input);
        int ans = input;

        for(int i=0; i<s.length(); i++) {
            ans = ans + Integer.parseInt(s.substring(i, i+1));
        }

        if(ans<=5000) b[ans] = true;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for(int i=1; i<=5000; i++) {
            solution(i);
        }

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

        System.out.println("sum = [" + sum + "]");
    }

}

2021/08/16 17:14

이병호

rangeset = set(range(1,5000))
genset = set((i + sum(int(a) for a in str(i))) for i in range(1,5000))
resultset = rangeset - genset
print(sum(resultset))

2021/08/22 14:43

//python

def d(a):
    c = 0
    a_1 = str(a)
    for i in range(len(a_1)):
        c += int(a_1[i])
    return a+c

a = [d(i) for i in range(5000)]
b = [n for n in range(5000) if n not in a]

print(sum(b))

2021/08/26 15:27

박대선

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Generator{

    public static void main(String[] args){

        int sumAll = 0, sumGen = 0;
        Set<Integer> set = new HashSet<Integer>();

        for(int i=1;i<5000; i++){
            int cal = (((i/1000) % 10) + ((i/100) % 10) + ((i/10) % 10) + (i%10) + i);
            sumAll += i;
            if(cal < 5000) set.add(cal);
        }
        Iterator<Integer> iterSet = set.iterator();
        while(iterSet.hasNext()){
            sumGen += iterSet.next();
        }
        System.out.println(sumAll - sumGen);
    }
}

2021/08/27 13:39

Jake Kim

# d(n)을 만드는 함수 제작
# 1~5000까지 generator해서 리스트로 만들기
# 1~5000 값과 리스트 비교해서 없는 값 찾아내기

def generator(n):
  n = str(n)
  n_list = list(n)
  sum = 0
  for i in n_list:
    sum = sum + int(i)
  sum = sum + int(n)
  return sum


a = list(range(5001))
b = []
for i in a:
  b.append(generator(i))

c = {}
c = set(a) - set(b)

print(sum(c))

2021/08/27 18:59

Beom Yeol Lim

answer를 std::cout으로 출력하기 때문에 iostream헤더가 필요합니다.

int generators[5000];
    for (int i = 0; i < 5000; i++)
    {
      //단순무식하게 나머지연산 4번
      generators[i] = i + i / 1000 + (i / 100) % 10 + (i / 10) % 10 + i % 10;
    }

    //5000 이하 자연수 중에 해당 인덱스가 generated되었는지 저장하는 배열
    bool bGenerated[5000] = { false, };
    for (int generator : generators) 
    {
        if (generator < 5000)
            bGenerated[generator] = true;
    }

    int answer = 0;
    for (int i = 0; i < 5000; i++) 
    {
        if (bGenerated[i])
            continue;

        answer += i;
    }

    std::cout << answer;

2021/09/09 16:35

존낙생

result=[]
for i in range(1,5000):
    dn=0
    for j in str(i):
        dn+=int(j)
    dn+=i
    result.append(dn)
sum=0
for i in range(1,5000):
    if i not in result:
        sum+=i
print(sum)

2021/09/20 16:11

ninanino

def find_generated_numbers(a):
    g = []
    for n in range(a):
        y = n
        while n > 0:
            y += n % 10
            n = n//10
        g.append(y)
    return g       

if __name__ == '__main__':
    a = int(input())
    G = find_generated_numbers(a)
    S = []
    for i in range(a):
        if i not in G:
            S.append(i)
    print(sum(S))

2021/09/26 18:30

서현준

void main()
{   
    int selfsum = 0;
    int num = 1;
    vector<int> Generator;
    char* Buffer = new char[10];
    while (true)
    {
        int Calc = 0,Len = 0;
        sprintf_s(Buffer,10,"%d",num);
        Len = strlen(Buffer);
        for (int i = 0; i < Len; i++)
            Calc += Buffer[i] - '0';
        Calc += num;
        Generator.push_back(Calc);
        num++;
        if (Calc > 5000)
        {
            for (int i = 1; i < 5000; i++)
            {
                if (find(Generator.begin(), Generator.end(), i) == Generator.end())
                    selfsum += i;
            }
            break;
        }
    }
    cout << selfsum;
}

2021/10/07 11:16

aozora18

static void selfNumber(int x) {
        int[] num = new int[x];
        for (int i = 1; i < x; i++) {
            int sum = 0;
            if ((i + "").length() > 1) {
                for (int j = 0; j < (i + "").length(); j++) {
                    sum += (i + "").charAt(j) - 48;
                }
                sum += i;
            } else {
                sum += i + i;
            }
            if (sum <= x)
                num[sum - 1] += 1;
        }
        int total = 0;
        for (int i = 0; i < num.length; i++) {
            if (num[i] == 0) {
                total += i + 1;
            }
        }
        System.out.println(total);
    }

    public static void main(String[] args) {
        selfNumber(5000);
    }

2021/10/24 19:08

박대현

var arr = new Array();

for(var i = 1; i < 5000; i++) {
    var check = 0;

    if(i.toString().length > 1) {
        var num = 0;
        var nowNum = i.toString();

        for(var j = 0; j < i.toString().length; j++) {        
            num += parseInt(nowNum[j]);
        }

        check = num + i;
    } else {
        check = i + i;
    }

    if(arr.indexOf(check) == -1) {
        arr.push(check);
    }
}

var result = 0;

for(var i = 0; i < 5000; i++) {
    if(arr.indexOf(i) == -1) {
        result += i;
    }
}

2021/11/10 16:14

KHH Coder

def reverse_generator(number):
    import math

    number_temp = number
    dn = number_temp
    cipher = int(math.log(number_temp, 10)) + 1

    for i in range(cipher):
        current_decimal = number_temp % 10
        dn = dn + current_decimal
        number_temp = (number_temp - current_decimal) / 10

    return int(dn)

generators = dict()

for i in range(5000):
    temp = reverse_generator(i + 1)
    if temp in generators:
        generators[temp] = generators[temp] + 1
    else:
        generators[temp] = 1

sum = 0
for i in range(5000):
  if not i in generators.keys():
    sum = sum + i

print(sum)

2021/11/13 17:30

Stephen Kim

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        boolean bool[] = new boolean[7000];
        Arrays.fill(bool,false);
        int sum = 0;
        for(int i=0; sum < 5000;i++){
            int temp = i;
            sum = temp + temp%10 + (temp/10)%10 +(temp/100)%10 + (temp/1000);
            System.out.println(sum);
            bool[sum]=true;
        }
        int temp=0;
        for(int i =0; i <= 5000; i++){
            if(bool[i]==false){
                temp += i;
                //System.out.println(i);
            }    
        }
        System.out.println(temp);
    }
}

2021/12/02 23:23

김형호

python 3.9

d = [eval("+".join(str(i))) + i for i in range(1, 5000)]

sum([i for i in range(1, 5000) if i not in d])

2021/12/04 08:48

bangrangman

check = set()
sum_of_all = 0
for i in range(1, 5000):
    sum_of_all += i    #1~4999까지 합
    j, k = divmod(i, 1000)    #j:1000의 자리
    k, l = divmod(k, 100)    #k:100의 자리
    l, m = divmod(l, 10)    #l:10의 자리, m:1의 자리
    num = i+j+k+l+m
    if num < 5000: check.add(num)   #not self number
sum_of_non = 0
for s in check:
    sum_of_non += s
ans = sum_of_all - sum_of_non
#print(f'sum_of_all={sum_of_all}, sum_of_non={sum_of_non}')
print(ans)

2021/12/13 16:53

Seungmin Kim

def d (n) :
    arr = list(map(int,"".join(str(n))))
    return sum(arr) + n

i =1
arr = set()
arr1 = set()
for k in range(1,5001) :
    arr1.add(k)

while d(i) <= 5000 :
    arr.add(d(i))
    i +=1

result = arr1 - arr

print(sum(result))

2021/12/19 12:01

양캠부부

def generator(x):
    temp = [i for i in str(x)] 
    return sum(map(int, temp),x)
not_self_numbers = set(generator(x) for x in range(1,5001))
print(sum([y for y in range(1,5001) if y not in not_self_numbers]))

2021/12/27 22:44

bryn0726

sum(set(range(1, 5000)) - set([ x + sum([int(a) for a in str(x)]) for x in range(1, 5000)]))

2021/12/29 16:46

HiHiHi

self_list = [ num for num in range(1,5000)]

for n in range(1,5000):
    num1 = divmod(n,1000)
    num2 = divmod(num1[1],100)
    num3 = divmod(num2[1],10)
    result = n + num1[0] + num2[0] + num3[0] + num3[1]
    if result in self_list:
        self_list.remove(result)

print(sum(self_list))

2022/01/03 21:53

강태호

sum=0
a=1
n=1

set = set([])

while a<5000:
    sum+=a
    a+=1

while n<5000:
    if 0<n<10:
        set.add(n+n)
    elif 10<=n<100:
        set.add(int(n/10)+(n%10)+n)
    elif 100<=n<1000:
        set.add(int(n/100)+int((n%100)/10)+(n%10)+n)
    else:
        num = int(n/1000)+int((n%1000)/100)+int((n%100)/10)+(n%10)+n
        if num<5000:
            set.add(num)
    n+=1

lists = list(set)

result = 0
for list in lists:
    result+=list

print(sum)
print(result)
print(sum-result)

2022/01/07 13:07

BANG

sum=0
sum2=0
set = set([])

def generator(num):
    result = 0
    for num in str(num):
        result+=int(num)
    return result 

for i in range(1,5000):
    sum+=i

for i in range(1,5000):
    if (generator(i)+i) <5000:
        set.add(generator(i)+i)

lists = list(set)

for num in lists:
    sum2+=num

print(sum-sum2)

2022/01/07 13:37

BANG

sum(set(range(5000))-set(sum([int(v) for v in str(N)])+N for N in range(5000)))

1227365

두 번째 range 부분에서 0~5000까지 generator를 계산하는 것 때문에 속도가 조금 느리게 나오는 것 같음.

2022/01/09 20:04

­김태경 / 학생 / 농림생물자원학부

#code82
def digit(a):
    n=1
    while int(a/10)>0:
        a=a/10
        n+=1
    return(n)    
list=list(range(1,5001))
for target in range(1,5001):
    n=digit(target)
    a=0
    for i in range(0,n): #n자리 수일때
        a+=int(str(target)[i])
    a+=target    
    if list.count(a)!=0:
        list.remove(a)
print(sum(list))    

2022/01/13 19:51

kyk

def d(n) : if n < 10 : result = 2 * n return result elif 9 < n < 100: result = int(n/10) + n%10 + n return result elif 99 < n < 1000 : result = int(n/100) + int((n - int(n/100)100)/10) + n%10 + n return result else : result = int(n/1000)+int((n-int(n/1000)1000)/100)+ int((n - int(n/100)*100)/10)+n%10 + n return result

gnt = list()
for i in range(1,5030): gnt.append(d(i))

n_sum = 0 for n in range(1, 5001): if n not in gnt : n_sum += n

print(n_sum)

2022/01/18 11:16

배시원

generatorNum = lambda x : sum([int(i) for i in str(x)]) + x
print(sum(set(range(1, 5000))-set([generatorNum(i) for i in range(1, 5000) if generatorNum(i) < 5000])))

2022/01/18 19:35

이승환

package fortest;

public class GeneratorTest {
    public static void main(String[] args) {
        int sum;
        sum = 0;
        int generator;
        boolean[] selfnum = new boolean[5000];
        for (int i = 0; i < 5000; i++) {
            generator= generator(i+1);
            if(generator<5000)
                selfnum[generator-1]= true;
        }

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

            if(selfnum[i]==false)
                sum+=i;

        }
            System.out.println(sum);

    }

    static int generator(int num) {
        int a, b, c, d;
        int generator;
        a = num / 1000;
        b = (num % 1000) / 100;
        c = ((num % 1000) % 100) / 10;
        d = (((num % 1000) % 100) % 10);
        generator=a+b+c+d+num;
        return generator;
    }

}

2022/01/26 17:44

김재선

// Rust

// n<d(n)이므로 n은 d(n) 최대값-1까지만 검사하면 됩니다

// 가능한 d(n)을 HashSet에 넣고, 안들어있으면 합해서 출력합니다. 답은 1227365

use std::collections::HashSet; fn self_num(limit: u32) {

let d_n = (1..limit-1).map(|n| n.to_string().chars()
                                            .map(|c| c.to_digit(10).unwrap())
                                            .sum::<u32>() + n)
                      .collect::<HashSet<u32>>();
let res: u32 = (1..limit).filter(|d| !d_n.contains(&d)).sum();
println!("{}", res);

}

2022/01/26 21:38

JW KIM

def generator(a):
    return sum(int(i) for i in str(a))+a

dn_list = [generator(x) for x in range(5000)]

print(sum(set([x for x in range(5000)]) - set(dn_list)))

2022/01/28 10:33

로만가

a=list(range(1,5001)) def gen(n): global a b=n for i in range(len(str(n))): b+=int(str(n)[i]) if b in a: a.remove(b)

for j in range(5000): gen(j) print(sum(a))

2022/01/31 15:45

권한솔

def d(n):
    return sum([int(x) for x in str(n)])+n

gen_SET = [d(x) for x in range(5000) if d(x)<5000]
self_number = [x for x in range(5000) if gen_SET.count(x) == 0]

print(sum(self_number))

2022/02/07 17:32

로만가

def dn(x):
    return eval(('+'.join(str(x)))+('+'+str(x)))

self_no = list(range(5000))

for i in range(5000):
    if dn(i) in self_no:
        self_no.remove(dn(i))

print(sum(self_no))

2022/02/11 00:10

엄태용

s0 = set(range(1,5000))

s1 = {(i+sum(map(int, list(str(i))))) for i in range(1,5000)}

print(sum(s0-s1))

2022/02/11 16:43

이승일

#include <stdio.h>

int arr[5001];

int self(int n)
{
    int num = n;
    while (n > 0)
    {
        num += n % 10;
        n /= 10;
    }
    return num;
}

int main()
{
    int n;
    int sum = 0;

    for (int i = 1; i < 5001; i++)
    {
        n = self(i);
        if (n < 5000)
        {
            //셀프 넘버 제외한 값들
            arr[n] = 1;
        }

    }

    for (int i = 1; i < 5001; i++)
    {
        if (arr[i] == 0)
            sum += i;
    }
    printf("%d\n", sum);

    return 0;
}

2022/02/11 17:36

다흡

package org.javaturotials.ex;
import java.util.*;
import java.util.stream.Collectors;

public class test {
    public static void main(String[] args) {    
        int sum=0;
        for(int i = 1; i < 5000; i++ ) {
            int count=0;
            for(int j = 1; j < i; j++ ) {
                String str = String.valueOf(j);
                String[] arr = str.split("");
                int num=j;
                for(int z = 0; z<arr.length; z++) {
                    num+=Integer.valueOf(arr[z]);
                }
                if(i==num) {count++;}
            }
        if(count==0) {sum+=i;}
        }
    System.out.println(sum);
    }
    }

2022/02/21 21:28

Kkubuck

package jjs;

public class HelloWorld {
    public static void main(String[] args) {
        //5000
        int a,b,c,d,e;
        int result;
        int generator;
        int sum=0;
        int[] count=new int[5000];
        for(generator=1; generator<5000; generator++)
        {
            a=generator/1000;
            b=(generator/100)%10;
            c=(generator/10)%10;
            d=generator%10;

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

            if((result>=1)&&(result<5000))
            {
                count[result]=1;
            }
        }
        for(int i=1; i<5000; i++){

            if(count[i]==0)
            {
                sum=sum+i;
            }
        }
        System.out.println(sum);
    }
}

2022/02/23 15:15

뇌빼기절대금지

def d(a):
    sum = a
    for i in range(0,len(str(a))):
        sum +=int(str(a)[i])
    return sum
x=0
sum_selfnum = 0
while x<5000:
    y=0
    x+=1
    for i in range(1,x+1):
        if x==d(i):
            break
        else:
            y+=1
            if y==x:
                sum_selfnum+=x
print(sum_selfnum)

1227365

2022/03/01 18:24

코딩초보박영규

#include <iostream>
#include <vector>

int generator(int n) {
    int sum = n;
    while (n != 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

int main() {

    std::vector<int> genNum{};
    std::vector<int> selfNum{};
    int i = 0;
    while (i < 5000) {
        genNum.push_back(generator(i + 1));
        i++;
    }
    for (int i = 0; i < 5000; i++) {
        bool check = true;
        for (int v : genNum){
            if (v == (i + 1)) {
                check = false;
                break;
            }
        }
        if (check) {
            selfNum.push_back(i + 1);
        }
    }

    int sum = 0;

    for (int elem : selfNum) {
        sum += elem;
    }

    std::cout << sum;

}

2022/03/02 18:48

YEON

sett = set()
generator = set()

def d(num):
    sum = num
    for h in range(0, len(str(num))):
        sum = sum + int(str(num)[h])
    return sum

for j in range(1,5001):
    generator.add(j)

for i in range(1,5001):
    sett.add(d(i))


print(sum(generator.difference(sett)))

2022/03/05 01:07

무기

def d(n):
    result = n
    n = str(n)
    for i in n:
        result += int(i)
    return result

n = 1
key = []
val = []

self_number = 0

while n < 5000:
    key.append(str(n))
    val.append(str(d(n)))
    n += 1

for i in key:
    if i not in val:
        self_number += int(i)

print(self_number)

2022/03/16 05:50

Jaehyun Shin

# 제너레이트 함수 정의
def d_fn(n):
    result = n
    n_list = list(str(n))
    for n_i in n_list:
        result += int(n_i)
    return result

# 1~5000까지 제너레이트 결과값 리스트를 만들어둔다.
gen_result=[]
for i in range(1,5000):
    gen_result.append(d_fn(i))

# 1~5000까지 값들 중에 결과값 리스트에 없으면 셀프넘버에 등록한다.
self_number=[]
for i in range(1,5000):
    if gen_result.count(i) == 0:
        self_number.append(i)

# print(self_number)
print(sum(self_number))

2022/03/22 12:19

소망꿀

sum = 0

for i in range(1, 5001):
  count = 0
  for n in range(i):
    for x in str(n):
      n += int(x)
    if i == n:
      count += 1
  if count == 0:
    sum += i

print(sum)

2022/03/23 14:10

Charles

list = []
sf_cnt = 0
# 1부터 5000까지 숫자의 d(n)을 모두 계산해서 리스트에 추가
for i in range(1, 5000):
    count = 0
    for i2 in str(i):
        count += int(i2)
    count += int(i)
    list.append(count)
# 1부터 5000까지 위의 리스트에 대입하여 없으면 더하기
for j in range(1, 5000):
    if j not in list:
        sf_cnt += j
print(f'{sf_cnt:,}') # 1,227,365  

머리가 나쁜지 문제를 이해하는게 더 오래걸렸네요

2022/03/25 12:41

kh ahn

1227365 많이 배우고 갑니다.

2022/03/27 15:02

Jongjun Lee

li=[] for i in range(500): a=0 a+=i for j in str(i): a+=int(j) li.append(a) print(li) li1=set(li) print(li1) su=0 for i in li1: if i<500: su+=i print(i) print(su)

2022/04/10 17:26

yunjae

li=[] self=[] sum=0 for i in range(1,500): a=0 a+=i for j in str(i): a+=int(j) li.append(a) li=set(li) li=[i for i in li if i<500] print(li) for i in range(1,500): if i not in li: sum+=i print(sum)

2022/04/14 16:39

yunjae

li=[]
for i in range(5000):
    sum=0
    for j in str(i):
        sum+=int(j)+int(i)
        li.append(sum)
sum=0
for i in range(5000):
    if i not in li:
        sum+=i
print(sum)

2022/05/07 16:56

yunjae

def d(n) :
  n_st = str(n)
  sum1 = n
  for i in range(0, len(n_st)) :
    sum1 = sum1 + int(n_st[i])
  return sum1

list1 = [k for k in range(1, 5000)]

for i in range(1, 5000) :
  n = 0
  while n <= i :
    if d(n) == i :
      list1.remove(i)
      break
    n = n + 1


print(sum(list1))

2022/05/10 01:07

나유진

gen_num = []
self_num = []
sum_self_num = 0
for a in range(2, 5000):
  for i in range(1,a):        #자신을 더한 값이기 때문에 101의 제너레이터는 101보다 작은 값
    p = str(i)
    Sum = 0
    for j in range(len(p)):
      Sum += int(p[j])
    Sum += i
    if Sum == a:
      gen_num.append(a)
for i in range(1, 5000):
  if not i in gen_num:
    sum_self_num += i
print(sum_self_num)

2022/05/10 10:42

이승훈

JavaScript

  1. n개의 배열을 만들고 ture 값을 넣어줍니다.

  2. 셀프넘버를 찾는 수식을 이용해 찾아진 수를 배열의 인덱스로 놓고 해당 값을 false로 바꿔줍니다.

  3. 배열에서 true 값으로 남은 숫자들이 셀프넘버이기에 합을 구해줍니다.

function totalSelfNumber(n) {    
    const result = new Array(n).fill(true); //1 ...
    for (let i = 1; i < n; i++) {
        let selfNumber = i.toString().split('').reduce((acc, cur) => acc + parseInt(cur), 0)+i;   //2...
        ( selfNumber < n ) && (result[selfNumber] = false);
    }
    return result.reduce((acc, cur, idx) => (cur)?(acc+idx):acc, 0); //3...
}
console.log(totalSelfNumber(5000)); //log출력

2022/06/06 14:11

jihun kim

자바로 풀어봤습니다. 자연수 n을 입력하시면 1~n 범위내에 존재하는 제네레이터의 합을 출력합니다.

import java.util.Scanner;
import java.util.ArrayList;


public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        ArrayList<Integer> generator = new ArrayList<>();

        int n;

        // 자연수 n 입력 받기
        while(true) {
            System.out.println("자연수 n을 입력하시오:");
            n = scan.nextInt();

            if(n<1) {
                System.out.println("잘못 입력하셨습니다.\n");
            }else {
                break;
            }
        }

        // 1부터 n까지 숫자들을 Generator라고 초기 설정 
        for(int i=1; i<n; i++) {
            generator.add(i);
        }

        // Generator가 아니면 generator 리스트에서 삭제
        for(int i=1; i<n; i++) {
            ArrayList<Integer> digits = new ArrayList<>();
            int j = i;
            int isGenerator=i;

            while(j>0) {
                digits.add(j%10);
                j /= 10;
            }

            // isGenerator = 본인 + 각 자릿수
            for(int k=0; k<digits.size(); k++) {
                isGenerator += digits.get(k);
            }

            // generator 리스트에서 generator가 아닌 수를 삭제
            if(isGenerator < n) {
                Object x = (Integer)isGenerator;
                generator.remove(x);
            }
        }

        // sum of generator
        int sumOfGenerator=0;

        for(int i=0; i<generator.size(); i++) {
            int j = generator.get(i);   
            sumOfGenerator += j;    
        }

        System.out.printf("Sum of Generator : %d\n", sumOfGenerator);
    }
}

2022/06/06 15:01

유로

def d(a):
    result = [a]
    for i in str(a):
        result.append(int(i))
    return sum(result)

list = [d(i) for i in range(5000)]
list2 = []
for i in range(1,5000):
    if i not in list:
        list2.append(i)


sum(list2)
1227365

2022/06/12 22:11

김시영

#제네레이터(generator)
def d(x):
    #각 자리수 더하기
    dn = []
    for i in range(0,5):
        try:
            dn.append(int((','.join(str(x)).split(','))[i]))
        except : pass
    return sum(dn)+x

#1부터 5000까지 제너레이터 구하기
gen_num = []
for i in range(1,5001):
    gen_num.append(d(i))

#셀프넘버 구하기
all_num = [ i for i in range(1,5001)]
self_num =set(all_num)-set(gen_num)

#self 넘버의 합
sum(self_num)

파이썬입니다

2022/06/19 15:19

Hote

print(sum(set(range(5000))-set(sum(map(int, list(str(i))))+i for i in range (5000))))

2022/06/20 14:04

김정욱

#include <stdio.h>
int chk[5001];
int main()
{
    for (int i=1; i<=5000; i++) {
        int num=0;
        num += i;
        int n=i;
        while(n>0) {
            num += n%10;
            n /= 10;
        }
        chk[num] = 1;
    }
    int sum=0;
    for (int i=1; i<=5000; i++) if (chk[i] == 0) sum += i;
    printf("%d",sum);
}

2022/06/22 02:04

최승환

lst = []

for i in range(5000):
    addi = 0
    for j in str(i):
        addi += int(j)
    lst.append(addi + i)

s = set(lst)

gen = []

for i in range(5000):
    if i not in s:
        gen.append(i)

sum(gen)

2022/06/23 10:57

mimeman


def d(n):
    a = int(int(n / 1) % 10)  # 첫쨰 자리
    b = int(int(n / 10) % 10)  # 둘째
    c = int(int(n / 100) % 10)  # 셋째
    d = int(int(n / 1000) % 10)  # 넷째
    generator = a + b + c + d + n
    return (generator)


alist = set()
for ii in range(5000):
    alist.add(d(ii))
print(sum(set(range(5000)) - alist))

2022/07/04 15:57

Tae Joo

def generator(x):                           #제너레이터 함수 만들기
    num = list(map(int, str(x)))
    sum_num = sum(num) + x
    return sum_num

num_list = []                               #제너레이터 숫자 리스트에 추가
for num in range(1, 5001):
    num_list.append(generator(num))

result = set(num_list)                      #제너레이터 리스트에 중복 숫자 제거

self_number_sum = 0

for self_num in range(1, 5001):             #1~5000인 수 중에 제너레이터 리스트에 포함되어 있는 숫자가 아닌경우의 숫자만 더하기
    if self_num not in result:
        self_number_sum += self_num

print(self_number_sum)

2022/07/17 10:11

박종훈

su = 0 su2 =0 십자리 = 0 백의자리 = 0 천의자리 = 0 일의자리 = 0 li = []

for i in range(1,5001): su = 0 십자리 = i // 10 % 10 일의자리 = i % 10 백의자리 = i // 100 % 10 천의자리 = i // 1000 % 10

if 십자리 > 0:
    su += 십자리

if 일의자리 > 0:
    su += 일의자리

if 백의자리 > 0:
    su += 백의자리

if 천의자리 > 0:
    su += 천의자리

li.append(su + i)

for i in range(1,5001): if i in li: continue else: su2 += i

print(su2)

2022/07/20 22:31

권회준

def generator(num):
    str_num = str(num)
    sum = num
    for i in range(len(str_num)):
        sum += int(str_num[i])
    return(sum)

full = set(range(1,5000))
have = []

for i in range(1, 5000):
    have.append(generator(i)) 

have = set(have)
not_have = full - have
print("1이상이고 5000보다 작은 모든 셀프 넘버들의 합은 {0} 입니다.".format(sum(not_have)))

2022/07/27 01:59

김준성

d = lambda n : n + sum(int(x) for x in str(n))
sum(set(range(1,5000))-set([d(n) for n in range(1,5000)]))

2022/07/27 14:38

JC YUN

#include<stdio.h>
int main(Void)
{
    int i, j, k, sum, numbers[4999], total = 0;
    char x[5];

    for (i = 1; i < 5000; i++)
    {
        numbers[i - 1] = i;
    }

    for (i = 1; i < 5000; i++)
    {
        sprintf(x, "%d", i);
        sum = i;

        j = 0;
        while (x[j] != '\0')
        {
            sum += ((int)x[j]) - 48;        // 아스키코드 이용'
            j++;
        }


        for (k = 0; k < 4999; k++)
        {
            if (sum == numbers[k])
            {
                numbers[k] = 0;
                break;
            }
        }
    }

    for (i = 0; i < 4999; i++)
    {   
        total += numbers[i];
    }
    printf("%d", total);


}

2022/07/31 15:53

코딩재미

import java.util.ArrayList;
public class Problem1 {

    static int nSMaker (int n) {  // !Self-Number 생성기
        String nS = String.format("%04d", n);

        int a = Integer.parseInt(String.valueOf(nS.charAt(0)));
        int b = Integer.parseInt(String.valueOf(nS.charAt(1)));
        int c = Integer.parseInt(String.valueOf(nS.charAt(2)));
        int d = Integer.parseInt(String.valueOf(nS.charAt(3)));
        return 1001*a + 101*b + 11*c + 2*d;
    }


    public static void main(String[] args) {

        ArrayList<Integer> list = new ArrayList<>(); // 1~5000 리스트와 result 생성
        for (int i = 0; i<5000; i++) {
            list.add(i, i+1);
        }
        int result = 0;

        for (int i = 0; i<5000; i++) {  // 리스트에서 !Self-Number 찾아서 제거
            int temp = nSMaker(i);

            if (temp < 5001){
                int j = list.indexOf(temp);
                if (j>0) {
                    list.remove(j);
                }

            }
        }

        for (Integer i : list) { // 남은 수(Self-Number) 합계
            result += i;
        }

        System.out.println(result);
    }
}

자바로 작성해 보았습니다.

2022/08/09 10:33

백진성

self_total = list(range(5000))
for i in range(5000):
    sum_list = []
    for j in str(i):
        sum_list.append(int(j))
    sum_list.append(i)
    sum_list = sum(sum_list)
    if sum_list in self_total:
        self_total.remove(sum_list)
print(sum(self_total))

2022/08/15 14:12

강TT

dn=[]
dn_total=[int(a) for a in range(1,5000)]
for i in range(1,5000):
    generator=[int(b) for b in str(i)]
    generator.append(i)
    generator_sum=sum(generator)
    dn.append(generator_sum)

dn_total_set=set(dn_total)
dn_set=set(dn)
dn_self=dn_total_set-dn_set

2022/08/18 00:25

나무늘보

def gen(num):
    sum=0
    for i in str(num):
        sum+=int(i)
    sum+=num
    return sum
listgen=[]
for i in range(5000):
    listgen.append(gen(i))
listgen=set(listgen)
set5000=set(range(1,5001))
print(sum(set5000-listgen))

2022/08/18 21:39

kee

def d(num):
    # Use a breakpoint in the code line below to debug your script.
    t3 = num//1000
    t2 = (num-t3*1000)//100
    t1 = (num-t3*1000-t2*100)//10
    t0 = (num - t3 * 1000 - t2 * 100 - t1 * 10)

    return t3+t2+t1+t0+num

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    sum_a = 0
    sum_d = 0
    dnum = []

    for i in range(1,5000):
        sum_a += i
        try:
            dnum.index(d(i))
        except ValueError:
            if d(i) < 5000:
                dnum.append(d(i))



    print(sum_a-sum(dnum))

2022/08/20 18:27

황정현

a = list(range(1,5000))
d=[]
for i in range(0,5000):
    b=0
    c = list((str(i)))
    for x in range(len(c)):
        b += int(c[x])

    b+=i
    #b는 제너레이터(i)에 의해 만들어진 수
    if b in a:
        d.append(b)

e = list(set(a)-set(d))
f=0
for k in range(len(e)):
    f+=e[k]

print(f)

2022/08/24 00:39

허명재

real_li = list(range(1,5000))

remo = []
for i in range(1,5000):
    t = str(i)
    if i<10:
        remo.append(i+i)
    elif i<100:
        remo.append(i+int(t[0])+int(t[1]))
    elif i<1000:
        remo.append(i+int(t[0])+int(t[1])+int(t[2]))
    else :
        remo.append(i+int(t[0])+int(t[1])+int(t[2])+int(t[3]))

new_remo = list(set(remo))

for i in new_remo[:]:
    if i >=5000:
        new_remo.remove(i)
    else:
        pass



for i in new_remo:
    real_li.remove(i)

print(sum(real_li))

2022/09/02 16:06

정일산

#include <stdio.h>
#include <string.h>

char n[100];
char string[100];
int from_1_to_5000_within[5001];

int d(char n[]);
char *make_to_string(int number);
void make_in_number(void);
int total_self_number(void);

int d(char n[])
{
    int number;
    int a;
    number = atoi(n);
    for (a = (strlen(n) - 1); a >= 0; a--)
    {
        number = number + atoi(&n[a]);
        n[a] = '\0';
    }
    printf("%d\n", number);
    return number;
}

char *make_to_string(int number)
{
    sprintf(string, "%d\\0", number);
    return string;
}

void make_in_number(void)
{
    int a;
    for (a = 0; a <= 5000; a++)
    {
        from_1_to_5000_within[a] = 0;
    }
    for (a = 1; a <= 5000; a++)
    {
        from_1_to_5000_within[a] = a;
    }
    for (a = 1; a <= 5000; a++)
    {
        printf("%d\n", from_1_to_5000_within[a]);
    }
}

int total_self_number(void)
{
    int a;
    int total = 0;
    for (a = 1; a < 5000; a++)
    {
        printf("%d\n", from_1_to_5000_within[a]);
    }
    for (a = 1; a < 5000; a++)
    {
        total =
            total +
            from_1_to_5000_within[a];
    }
    return total;
}

int main(int argc, char *argv[])
{
    int generator = 1;
    int number;
    char *main_string = NULL;
    make_in_number();
    while (generator < 5000)
    {
        main_string = make_to_string(generator);
        number = d(main_string);
        if (number < 5000)
        {
            from_1_to_5000_within[number] = 0;
        }
        generator++;
    }
    printf("%d\n", total_self_number());
    return 0;
}

2022/09/10 22:42

박성우

def d(x):
    s = str(x)
    result = 0
    for i in range(len(str(x))):
        result += int(str(x)[i])
    result += x
    return result


n = 5000
l1 = []

# Making number list for having generator
for i in range(1, n+1):
    l1.append(d(i))

l1.sort()

# Summation of numbers no having the generator
total = 0
for i in range(1, n):
    if i not in l1:
        total += i

print(total)

2022/09/14 16:11

Jaeyoung Moon

public class Q2 {
    public static void main(String[] args) {
        int[] numlist = new int[5000];
        int numsum=0;
        for(int i=1;i<5000;i++) {
            numlist[i]=0;
        }
        for(int i=1;i<5000;i++) {
            if(d(i)>=5000) {
                continue;
            }
            else {
                numlist[d(i)]=1;
            }
        }
        for(int i=1;i<5000;i++) {
            if(numlist[i]!=1) {
                numsum=numsum+i;
            }
        }
        System.out.println(numsum);
    }
    public static int d(int a) {
        int sum=0;
        String s = Integer.toString(a);
        int[] c = new int[s.length()];
        for(int i=0;i<s.length();i++) {
            c[i]=s.charAt(i)-'0';   
        }
        for(int i=0;i<s.length();i++) {
            sum = sum+c[i];
        }
        sum=sum+a;
        return(sum);
    }
}

2022/09/21 09:50

김민중

파이썬입니다.

gen_nums = []
temp_num = 0
result = 0
for i in range(1,5001,1) :
    temp_num += i
    for j in str(i) :
        temp_num += int(j) 
    gen_nums.append(temp_num) 
    temp_num = 0 #초기화
gen_nums = set(gen_nums)
for i in range(1,5001,1) :
    if i not in gen_nums :
        result += i
print(result)

제네레이터 숫자가 있는 숫자들을 이용하여 없는 숫자를 뽑아봤습니다.

2022/10/26 12:29

ㅇㅇ

def generator(n):
    result = 0
    for i in range(0,len(str(n))):
        result += int(str(n)[i])
    result += n
    return result

List2 = []
a = 1
while a<5000:   
    if generator(a)<5000:
        List2.append(generator(a))
    a+=1
print(sum(set(range(1,5000))-set(List2)))

genarator 함수 자체를 만들어봤습니다


2022/10/27 11:29

이웅기

def cal_num(x):
    str_x = str(x)
    tmp = []
    for i in range(len(str_x)):
        tmp.append(int(str_x[i]))
    tmp.append(x)
    return sum(tmp)

self_num = [i+1 for i in range(5000)]
for i in range(5000):
    i = i + 1
    gen = cal_num(i)
    try:
        self_num.remove(gen)
    except:
        pass
print(sum(self_num))

2022/10/31 14:31

kimshin

x = 1
dn = set()

while True:
    if x < 10:
        dn.add(x + x)
        x += 1
    elif x < 100:
        dn.add(x + x // 10 + x % 10)
        x += 1
    elif x < 1000:
        dn.add(x + x // 100 + (x // 10) % 10 + x % 10)
        x += 1
    elif x < 10000:
        if (x + x // 1000 + (x // 100) % 10 + (x // 10) % 10 + x % 10) == 5000:
            break
        dn.add(x + x // 1000 + (x // 100) % 10 + (x // 10) % 10 + x % 10)
        x += 1

sum(set(range(1,5000)) - dn)

2022/11/04 11:49

stubborngastropod

Python. 제네레이터와 셀프 넘버의 개념 이해부터도 어렵네요;;;

def generator(n): #제너레이터를 만들기 위한 함수
    n=str(n)
    temp = 0
    for i in range(0, len(n)):
        temp+=int(n[i])
    result = int(n)+temp
    return result

numbers=list(range(1,5000)) #1 이상 5000 미만의 리스트를 만들고
for number in range(1, 5000):
    c=generator(number)
    if c in numbers:
        numbers.remove(c) #제너레이터가 존재하는 경우 해당 숫자를 리스트에서 제외하는 방식입니다.
    else:
        pass
print(sum(numbers)) #남아 있는 수, 즉 셀프 넘버들의 합을 출력

결과는 1227365 입니다.

2022/11/09 13:30

Frye 'de Bacon

손에 익은 list로 했는데 다른 분들 한 것 보니까 set으로 하면 코드가 더 짧아졌겠네요.

all_num = list(range(1, 5001))

for i in range(1, 5001):

    li_i = list(map(int, str(i)))
    sum_i = sum(li_i)
    generated = i + sum_i

    try:
        all_num.remove(generated)
    except:
        pass

print(sum(all_num))

답: 1227365

2022/11/14 00:54

조종섭

javascript 입니다.

// 합계
const sum = (set) => {

    let sum = 0;
    for(let i of set.keys()) {
        sum += i;
    }

    return sum;
}

// 제너레이터 구하기
const getGenerator = () => {

    let set = new Set();
    for(let i = 1; i < 5000; i ++) {
        let genNum = i;
        let checkGen = i;

        // 4자리수 -> 문제 요건만 생각하면 loop 필요없긴 합니다.
        let times = 3;
        while(times >= 0) {

            let pow = Math.pow(10, times);
            let quan = Math.floor(checkGen / pow);
            checkGen -= pow * quan;

            if(quan > 0) {
                genNum += quan;
            }

            times --;
        }

        if(genNum < 5000) {
            set.add(genNum);
        }
    }

    return set;
}

const nexon_generator = () => {

    let genSum = sum(getGenerator());
    let totalSum = sum(new Array(5000));

    // 1227365
    // 총합 - 제너레이터합계
    console.log(totalSum - genSum);
}

nexon_generator();

2022/11/15 16:35

J.D

함수형으로 작성해 보았습니다. 리뷰부탁드려요 ㅎㅎ

const range = (start: number, size: number) => [...Array(size - start + 1).keys()].map( i => start + i)
const getGenenrator = (target: number): number | null => {
  // d(x) = x[0]..x[n] + x === target
  for (let predictNum = target; predictNum > 0 ; predictNum--) {
    const generator = Array.from(String(predictNum))
      .reduce( (accNumber, partNum) => accNumber + parseInt(partNum), predictNum)

    if(generator === target) return predictNum
  }

  return null
}



const hasGenerator = (i: number) => getGenenrator(i) ? true : false
const isSelfNumber = (i: number) => hasGenerator(i) ? false : true


const sampleSelfNumber = [1,3,5,7,9,20,31]
const sampleNonSelfNumber = [101, 100] 


// for ( const checkNum of [...sampleSelfNumber, ...sampleNonSelfNumber]) {
//   console.log(checkNum, getGenenrator(checkNum))
// }

const testNum = 5000
const result = range(1, 5000)
  .filter(isSelfNumber)
  .reduce((accNumber, selfNum) => accNumber + selfNum, 0)

console.log(result)

2022/11/23 16:14

김동훈

#include <iostream>

using namespace std;

const int limit{5000};
int arr[5000] = {};

int main()
{
        int gen{1};
        int ret{};
        int cnt{};
        int n{1};

        while (gen < limit){

                ret = gen;
                int tmp = gen;

                while (tmp) {
                        ret += tmp % 10;
                        tmp /= 10;
                }
                if (gen < limit)
                        arr[ret] = gen;
                else
                        return 1;
                gen++;
        }

        while(n < limit)
        {
                if (!arr[n])
                        cnt += n;
                n++;
        }

        cout <<  cnt << endl;
        return 0;
}

2023/01/14 00:10

J

number = list(range(1,5000))

for i in range(1,5000):
    split = list(str(i))
    split = list(map(int, split))
    generated = i + sum(split)
    if generated in number:
        number.remove(generated)

print(sum(number))

5000보다 '작다'고 했으니까 5000전까지만 하는게 맞겠죠...?

2023/01/21 01:06

박래인

L1=[]; sum2=0
for i in range(1, 5000):
    sum1=i
    for j in range(len(str(i))):
        sum1+=(i%10)
        i//=10
    L1.append(sum1)

for i in range(1, 5000):
    if L1.count(i) == 0:
        sum2+=i

print(sum2)

2023/01/26 23:09

김민주

public class SelfNumber {

    public static void main(String[] args) {
        int sum = 0;
        for(int i = 0; i <6; i++) {
            for(int k = 0; k <10; k++) {
                for(int l = 0; l <10; l++) {
                    for(int o = 0; o <10; o++) {
                        int d = i+k+l+o+(i*1000)+(k*100)+(l*10)+o;
                        for(int p = 1; p<5000;p++) {
                            if(p==d) {
                                sum += d;
                            }
                        }
                    }
                }
            }
        }
        System.out.println(sum);
    }

}

2023/02/06 14:27

그란

generated_number=[] list1=[] list2=[]

for i in range(1,5001): list1=list1+[i]

for i in range(1,5001): preprefactor=i//1000 prefactor=i//100 factor=i//10 rest=i%10 list2=list2+[preprefactor+(prefactor%10)+((factor%100)%10)+rest+i]

final_list=[item for item in list1 if item not in list2] print(final_list) print(sum(final_list))

2023/02/28 14:17

musultang

def user_func(x):
    temp_data = 0
    for i in list(str(x)):
        temp_data += int(i)
    return (temp_data + x)

print(sum(set(range(1, 5000)) - set([user_func(i) for i in range(1, 5000)])))

2023/03/15 16:35

용맨달려

def d(number): total = number number = str(number) for i in number: total += int(i) return total

self_number_total = 0 self_number_set = set()

for i in range(1,5000): self_number_set.add(d(i))

for i in range(1,5000): if not i in self_number_set: self_number_total += i

print(self_number_total)

2023/03/18 20:49

최준하

def gene(num):
    result = 0
    for i in num:
        result += int(i)
    return result + int(num)

non_self_num = []
all_num      = []
for i in range(1, 5001):
    all_num.append(i)
    result = gene(str(i))
    non_self_num.append(result)

result = list(set(all_num) - set(non_self_num))
print(sum(result))

2023/03/31 14:31

HoHyeon Kim

#셀프넘버의 합이 아니라 셀프넘버를 구해보고 싶어서 코드를 짜봤습니다.

ans = set(range(1, 5000))

for i in range(1, 5000):
    sum = int(i + i//1000 + i%1000//100 + i%100//10 + i%10)
    if sum in ans:
        ans.remove(sum)

print(ans)





2023/04/03 11:08

심영채

gen_sum = 0
generator = 0

for i in range(1,5000):
    for j in range(1,i+1):
        gen_sum = j
        please = 0
        while j>0:
            x = j % 10
            gen_sum += x
            j //= 10
        if i == gen_sum:
            please = 0
            break
        else:
            please+=1
    if please!=0:
        generator+=i


print(generator)





2023/04/12 17:16

이태규

def generator(number):
    cipher = len(str(number))
    total = 0
    for idx in range(cipher):
        save = str(number)[idx]
        total += int(save)
    total += number
    return total

input = 5000

gen_result_list = []
for idx in range(input):
    gen_result_list.append(generator(idx+1))

comparison_list = []
for idx in range(5000):
    comparison_list.append(idx+1) 

answer = list(set(comparison_list)-set(gen_result_list))
answer.sort()
print(sum(answer))

2023/04/15 22:58

이준수

#generator
def d(num):
    word = str(num)
    gen = 0
    for x in word:
        gen += int(x)
    return gen + num

#selfnumber checker
def isself(num):
    trynum = 1
    while trynum <= num:
        if num == d(trynum):
            return False
        trynum += 1
    return True

total = 0
for x in range(1, 5000):
    if isself(x):
        total += x

print(total)

2023/04/17 23:48

유하

def GetNumber(number):
    return sum(int(a) for a in str(number)) + number

AllSelfNumbers = set(range(5000))
for number in range(5000):
    b = GetNumber(number)
    if b in AllSelfNumbers:
        AllSelfNumbers.remove(b) 

print(sum(AllSelfNumbers))

2023/04/18 00:27

졸린하마

def nexon(): s = set(range(1,5000))

#set의 축약형
#ps는 d(n) 값들의 세트 
ps = {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)}

#제너레이터가 없다는 것은 d(n) 값도 없다는 말
print(sum(s - ps))

nexon()

2023/04/18 16:04

장지훈

a=set(range(1,5000))

b=set(i//1000 + i%1000//100 + i%100//10 + i%10 + i for i in a)

print(sum(a-b))

파이썬 3일차 입문자 답 맞혔다! 이 쾌락에 프로그래머 하는건가 ㅋㅋ

2023/04/27 15:21

한세록

def d(n):
    n_str = str(n)
    num_digit = len(n_str)

    sum = 0
    for i in range(num_digit):
        sum = sum + int(n_str[i])

    sum = sum + n
    return sum

self_num = set([x for x in range(1, 5000)])
not_self_num = set([])
for x in range(1, 5000):
    not_self_num.add(d(x))

print(sum(self_num - not_self_num))

답: 1227365

2023/05/01 15:22

Jisook

public class ex01_Lv2 {
    public static void main(String[] args) {
        // d(i) = (i의 각 자릿수 합) + i 일 때,
        // i는 d(i)의 제너레이터(generator)라고 한다.
        // 박-보규 란, i는 i인데 제너레이터가 없는 i이다.
        // 즉, 정수 1부터 제너레이터로 취급해서 계속해서 di를 생성한다.
        // 이후 생성된 di가 5000을 넘어가면 반복을 종료한다.
        // 이때, di는 1~5000까지의 숫자이므로 이 생성된 di를 제외한
        // 나머지 di를 뽑아내 더하기만 하면 끝이다.
        boolean[] booleans = new boolean[5000];
        boolean bool = true;
        int i = 0;
        int total = 0;
        while(bool == true) {
            i++;
            int tsd =  i / 1000;
            int hrd =  (i / 100) % 10;
            int ten =  (i / 10) % 10;
            int one = i % 10;
            int di = tsd + hrd + ten + one + i;
            if(di <= 5000)
                booleans[di - 1] = true;
            else if(di > 5000)
                break;
        }

        for(int f = 0; f < 5000; f++) {
            if(booleans[f] == false) {
                total +=  f + 1;
            }
        }
        System.out.println(total);
    }
}

2023/06/24 12:09

심상균

numbers = [];non_self = []
_sum = 0;_sum_ = 0
for i in range(5001):
   numbers.append(i)
for j in numbers: gen = j
   for k in str(j): _sum += int(k)
   _sum_ = _sum + j
   non_self.append(_sum_)
   _sum = 0;_sum_ = 0
for k in non_self:
   if k in numbers:
      numbers.remove(k)
print("SUM:",sum(numbers))

2023/07/20 15:09

siu yoon

n = [x for x in range(5000)]
notSelfNum = []

for i in n:
    iLst = list(int(x) for x in str(i))
    dn = sum(iLst) + i
    if dn in n:
        notSelfNum.append(dn)

selfNum = list(set(n) - set(notSelfNum))

print(sum(selfNum))

2023/07/23 10:58

Hawk Lee

# sum of self numbers 
sum_selfnums = sum(set(range(1,5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1,5000)})
print(sum_selfnums)

2023/07/23 16:40

Dongyoon Kim

#include <stdio.h>

int main()
{
    int num1[5001] = { 0, };

    for (int i = 1; i < 5000; i++)
    {
        int num2 = 0;
        int j = i;
        while (j != 0)
        {
            num2 += j % 10;
            j /= 10;
        }
        num2 += i;
        if (num2 <= 5000)
            num1[num2] = 1;
    }

    int sum = 0;
    for (int i = 1; i <= 5000; i++)
    {
        if (num1[i] == 0)
            sum += i;
    }

    printf("%d", sum);
}

2023/07/29 12:57

ᄋᄋᄋ

def d(n):
    s = str(n)
    result = sum(list(map(int, s))) + n
    return result

gen_results = set()
for num in range(1, 5000):
    result = d(num)
    if result < 5000:
        gen_results.add(result)

toal_nums = set([n for n in range(1,5000)])

self_numbers = toal_nums - gen_results
print(sum(self_numbers))

2023/08/12 17:56

이광진

def d(n):
    return sum(list(map(int, str(n)))) + n

#1 ~5000 미만의 셀프넘버 후보 수
T = set([n for n in range(1,5000)])

#제네레이터가 있는 수,  5000이 넘을 수 있음.
G = set([d(n) for n in range(1,5000)])

#차집합 T - G 의미는 1이상 5000미만이 수에서 제네레이터가 없는 수
print(sum(T - G))

2023/08/12 18:21

이광진

c언어

#include <iostream>

int f(int x) {

    int max=0,d=x;

    for (int a = 1; a <= 5; a = a++) {

        max = d % 10+max;

        d=d / 10;

    }

    return max + x;

}

int main()
{


    int max=0,d=0;

    for (int a = 1; a < 5000; a++) {

        for (int s = 1; s < a; s++) {

            if (a == f(s)) {

                d++;
                break;

            }

        }

        if (d==0) {

            max = max + a;

        }

        d = 0;

    }

    printf("%d", max);

}

2023/08/20 21:12

신우진

def d(n):
    n=str(n)
    p=0
    x=[]
    for i in n:
        x.append(i)
    for j in range(len(x)):
        p+=int(x[j])
    print(p+int(n))

2023/09/22 18:39

박화랑

list_non_sn = []

for i in range(5000): a = i str_i = str(i) for j in range(len(str_i)): a += int(str_i[j]) list_non_sn += [a]

list_non_sn = [item for item in list_non_sn if item <= 5000] list_non_sn = list(set(list_non_sn)) lst_sn = list(range(5001)) for i in list_non_sn: lst_sn.remove(i)

ans = 0 for i in lst_sn: ans += i

print(ans)

2023/11/21 14:49

윤영식

max_number = 5000

non_self_number = []

for i in range(max_number):
    d_operation = i + int(i/1000) + int((i%1000)/100) + int((i%100)/10) + int(i%10)

    if d_operation < max_number:
        non_self_number.append(d_operation)

self_number_sum = (max_number * (max_number - 1))/2 - sum(list(set(non_self_number)))

print(self_number_sum)

2023/11/24 17:23

박용규

#include <stdio.h>

int main(void){
    int selfsum = 0;
    for(int i=1; i<5000; i++){
        int count = 0;
        for(int j=1; j<i; j++){
            int num;
            num = j/1000 + (j%1000)/100 + (j%100)/10 + (j%10) + j;
            if(num == i){
                count++;
            }
        }
        if(count == 0){
            selfsum = selfsum + i;
        }
    }

    printf("%d\n", selfsum);

    return 0;
}

2024/01/16 16:52

조영재

not_selfnum = set([])
for i in range(5000):
    a = str(i)
    number_count = 0
    for number in a:
        number_count += int(number)
    number_count += i
    not_selfnum.add(number_count)
allnumber = list(map(lambda x:x, range(5000)))
allnum = set(allnumber)
resultnum = allnum - not_selfnum
result = 0
for r in resultnum:
    result += r
print(result) 

2024/02/03 14:27

리리

#include <iostream>
#include <algorithm>

using namespace std;

int ret, dp[5050];

int main()
{
    int num;

    for(int i=1; i<5000; i++)
    {
        num = i / 1000 + (i%1000) / 100 + (i%100) / 10 + (i%10) + i;
        dp[num] = 1;
    }

    for(int i=1; i<5000; i++)
    {
        if(dp[i])
        {
            continue;
        }
        else
        {
            ret += i;
        }
    }

    cout << ret << "\n";

    return 0;
}

2024/02/26 19:02

김준서

generator = set()

num = 1
g = 0
while num < 5000:
    cur = num
    g = cur
    while cur > 0:
        g += cur%10
        cur //= 10
    if g < 5000:
        generator.add(g)
    num += 1
print(5000*4999//2 - sum(generator))

2024/02/29 19:52

insperChoi

a=[] #좀 간단하게 #d는 제너레이터, 원래 수는 어케하지

b={} for x in range(1,5000): if x<10: d=x+x elif x<100: d=x+(x%10)+(x//10) elif x<1000: d=x+x//100+(x//10%10)+(x%10) #지금 a안에는 d가 있네, 숫자 그 자체가 아니라<<<<<int임 #a.append(d) b[x]=d print(b)

for key, value in b.copy().items(): for q in b.copy().values(): if value==q: del b.copy()[key]

여기까지 했는데 자꾸 오류가 남 ㅠ

2024/03/17 14:13

L L

       public static void main(String[] args) {
              Set<Integer> intGenerator = new HashSet<>();
              int num = 0;
              int result = 0;
              int max = 5000;
              int addResult = 0;
              int addAll = 0;

              for (int i = 1; i < max ; i ++){
                     int a1000 = i / 1000 ;
                     int a100 = (i % 1000) / 100;
                     int a10 = ((i % 1000) % 100) / 10;
                     int a1 = (((i % 1000) % 100) % 10) ;

                     result = a1 + a10 + a100 + a1000 + i ;
                     if(result >= 5000){
                            result = 0;
                     } else {
                            intGenerator.add(result);
                     }
              }

              System.out.print("Generator 의 합 = ");
              for (int x : intGenerator){
                     addResult = addResult + x;
              }
              System.out.println(addResult);

              for (int a = 1 ; a< 5000 ; a++ ){
                     addAll = addAll + a ;
              }
              System.out.println("답 " + (addAll - addResult));
       }
}

2024/04/01 10:12

지현

1227365

2024/04/03 12:37

그르렁옭

def sol(number):
    return [int(num) for num in str(number)]

number = int(input())
nums = sol(number)

result = 0

for i in range(len(nums)):
    result += nums[i]
result += number

print(result)

2024/05/29 15:42

김현빈

# 1~5000의 집합, self넘버가 아닌 집합 생성
sol = {}
noself = {}
for i in range(1,5000):
    sol.append(i)

# 제너레이터를 통한 숫자를 산출하는 함수 찾기
def d(n):
    sum = 0
    while sum < 5000: # 5000보다 작으므로 조건반복문
        sum = 0
        a = str(n)         # 각자리수 합을 위해 문자열변환
        for i in range(0,len(a)):   # 자리수만큼 반복
            sum += int(a[i])       # 자릿수 합
        sum += n        # 자기 자신 합
        n += 1           # 반복을 위한 카운팅
        print('sum:',sum)
        noself.append(sum) # 셀프넘버가 아닌 수 저장
d(1) #함수 작동

c = sol - noself   #  차집합연산을 통해 셀프넘버 찾기 -------- ★★★

# 셀프넘버들의 총합
answer = 0
c = list(c)
for i in range(len(c)):
    answer += c[i]
answer

# ★★★부터 다른 풀이
# 정확히 셀프넘버가 어떤 것인지 찾지 않고 합만 구할 경우
answer = 0
noself = list(noself)
for i in range(5001):
    answer += i
for i in range(0,len(noself)):
    answer -= noself[i]
answer


2024/10/13 20:30

송승민

def d(n):
    i = 0
    for num in str(n):
        i += int(num)
    return i + n

has_generators = []
sum_self_numbers = 0

for m in range(1, 5000):
    if d(m) not in has_generators:
        has_generators.append(d(m))

    if m not in has_generators:
        sum_self_numbers += m

print(sum_self_numbers)

---------------------------------

print(sum(set([i for i in range(1, 5000)]) - set([m + sum([int(a) for a in str(m)]) for m in range(1, 5000)])))

2024/12/07 10:10

Jamie Fly

숫자를 문자의 배열로 변환한 다음 각 자리수를 다시 숫자로 변환하여 더하는 방법을 이용했습니다. n>=5000인 임의의 자연수 n에 대해 D(n)>=5000이므로, 1부터 5000까지 D(n) 값들의 집합을 구한 후 1에서 5000까지 숫자들 중 해당 집합에 속하지 않는 숫자만을 남기는 식으로 계산했습니다.

D(n) 함수를 구현하기 위해 Generator 클래스를 별도로 만들었습니다.

package 넥슨_입사문제_중에서;

public class Generator {
    public int d(int n) {
        int sum = 0;
        char[] arr = (String.valueOf(n)).toCharArray();
        for (char c : arr) {
            sum += Character.getNumericValue(c);
        }
        sum += n;
        return sum;
    }
}

//--------------------------------------------------------------------

package 넥슨_입사문제_중에서;

import java.util.ArrayList;
import java.util.List;

public class Solution {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Generator generator = new Generator();
        List<Integer> notSelf = new ArrayList<Integer>();

        for (int i = 0; i < 5000; i++) {
            notSelf.add(generator.d(i+1));
        }

        int sum = 0;

        for (int j = 1; j < 5001; j++) {
            if(!notSelf.contains(j)) {
                sum += j;
            }
        }
        System.out.println(sum);
    }

}

2025/01/07 19:08

박준우

def makeNumber(genNum) :
    toStringNumber = str(genNum)
    sum = 0

    for i in toStringNumber :
        sum += int(i)

    sum += genNum

    return sum


##############  Main Program    ####################

##  1~50000사이의 자연수의 집합만들기
allNum = set()
##  1~50000의 숫자를 generator로 갖는 숫자 집합만들기
makeNum = set()

difNum = set()
sumSelfNum = 0

for i in range(1,5001):
    allNum.add(i)
    makeNum.add(makeNumber(i))


difNum = allNum - makeNum

for n in difNum:
    sumSelfNum += n if n < 5000 else None

print('Self-Number의 총합 : ' , sumSelfNum)

2025/01/30 21:05

yoonjaepa

'''
어떤 자연수 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 보다 작은 모든 셀프 넘버들의 합을 구하라.

'''

def generator(number):
 string = ([int(digit) for digit in str(number)])
 string.append(number)
 print(sum(string))

generator(int(input("숫자 입력 : ")))

2025/01/31 03:59

구점팔

sn_list =  list(range(1, 5001))

for i in range(1, 5001):
  b = int(i)
  for j in str(i):
    b+=int(j)
  if b in sn_list:
    sn_list.remove(b)

print(sum(sn_list))

2025/02/24 14:16

Dasol Lee

def get_generator():
    generator=[]
    num=[]
    for i in range(1,5001,1):
        d=i
        for k in str(i):
            num.append(k)

        for j in range(0,len(num),1):
            d+=int(num[j])
        generator.append(d)
        num=[]
    return generator

def get_selfnumber(a):
    num=[]
    self_num=[]
    sum=0
    for i in range (1,5001,1):
        num.append(i)

    for k in num:
        if k not in a :
            self_num.append(k)
            sum+=k
        elif k<1 and k>5000:
            break

    print(f'셀프 넘버(self-number)의 리스트 : {self_num}')
    return sum


y=get_generator()
selfnum_sum=get_selfnumber(y)
print(f'셀프 넘버(self-number)의 총합 : {selfnum_sum}')

초보자입니다. 더 간단하게 짜고 싶은데 안되네요...

2026/01/08 14:19

김규태


number_list=[]

for i in range(1,5000):
    number_list.append(i)

for i in range(1,5000):
    num=str(i)
    sum=0
    for j in num:
        sum+=int(j)
    sum+=i

    if sum in number_list:
        number_list.remove(sum)

result=0

for i in number_list:
    result+=i
print(result)

2026/01/20 21:09

키자루

sum(set(range(1, 5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)})

2026/05/04 20:52

우영재

목록으로