
어떤 자연수 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까지 제네레이터를 구한다.
2. 제네레이터 값을 구한걸 배열에 저장하는데 저장할때 5000 이상인걸 빼고 저장
3. set으로 반복된 숫자와 숫자를 정리하고, range(5000)과 차집합을 한다.
list_ = []
num = 5000
for i in range(num):
sub = 0
d = str(i)
for j in d:
sub += int(j)
generator = int(d) + sub
if generator<num:
list_.append(generator)
list_set=set(list_)
range_set = set(range(num))
sum_=sum(range_set-list_set)
print(sum_)
반복문으로 1부터 5000까지 제네레이터를 구한다.for i in range(num):
sub = 0
d = str(i)
for j in d:
sub += int(j)
generator = int(d) + sub
0부터 5000까지를 배열로 만들고 배열에 숫자를 각각 문자로 변환하여 자리수를 정수로 바꿔 sub에 저장합니다.
예) 만약 숫자가 232라고 했을때 문자 ‘232’이기 때문에 반복문할때 j의 값은 2 3 2 순으로 진행이 되며 그 값을 각각 더해 sub = 7
이후 int(d) 즉 원래 숫자와 각 숫자의 합을 더한다.
제네레이터 값을 구한걸 배열에 저장하는데 저장할때 5000 이상인걸 빼고 저장num = 5000
if generator<num:
list_.append(generator)
num은 5000으로 지정하려 5000보다 큰값은 저장안한다.
set으로 반복된 숫자와 숫자를 정리하고, range(5000)과 차집합을 한다.list_set=set(list_)
range_set = set(range(num))
sum_=sum(range_set-list_set)
print(sum_)
저장한 리스트를 집합으로 바꿔 중복된 숫자를 제거하고 0부터 4999까지에 집합을 만들어 둘이 차집합을 해 셀프 넘버를 구한다. 이후 sum으로 집합에 있는 수를 더해 출력
답 : 1227365
순서가 없기 때문에 리스트나 튜플에서 사용한 인덱싱이 불가능
교집합 : a $ b
합집합 : a | b
차집합 : a - b
집합에서의 요소 추가와 제거는 list 와는 다르게 작용한다.
- set add - 요소 추가
집합.add(’추가할 원소’)
- set update - 요소 여러개 추가
집합.update({’a’,’b’,’c’})
-set remove - 특정 요소 제거
집합.remove('제거할 원소')
-set discard - 특정 요소 안전하게 제거
집합.discard('제거할 요소')
-set pop - 임의의 요소를 갖고 온 후 제거
집합.pop() 랜덤으로 값 하나를 반환하고 제거한다.