넥슨 입사문제 중에서

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

길가의풀

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

395개의 풀이가 있습니다. 1 / 40 Page

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 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)

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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))

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
a=sum(set(range(1,5000))-{x+sum([int(i) for i in str(x)]) for x in range(1,5000)})
print(a)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

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;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬으로 작성되었습니다.

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문을 통해 돌면서 제너레이터를 가진 값들을 모두 소거하는 방식입니다.

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

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

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

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)

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

풀이 작성

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

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


언어별 풀이 현황
전 체 x 395
python x 136
기 타 x 61
r x 3
cpp x 59
java x 73
go x 1
objectivec x 5
javascript x 5
cs x 15
scala x 9
matlab x 5
php x 6
delphi x 3
ruby x 6
haskell x 2
lisp x 2
clojure x 2
perl x 1
erlang x 1