코딩 도장에 있는 넥슨 입사 문제 중에서...
어떤 자연수 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
|
sum(set(range(1, 5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)})
|
cs |
그리고 나의 답변은 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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))
|
cs |
답변을 올리면서도 몹시 민망했지만 아마 두고두고 보게 될 것 같다.ㅎ
http://codingdojang.com/scode/365?answer_mode=hide