우선 첫 번째 접근은 주어진 양의 정수 n을 10으로 나누고 나누고 하여
어떻게든 숫자를 쪼개려 하였다.
ex) n = 39 이면 n + (n/10) + (n%10) ..
하지만 이렇게 하면 위의 셈법이 적용되지 않는 숫자들이 너무 많았다.
심지어 첫 번째 풀이에서는 1~10000까지의 숫자를 배열에 저장해 두고
배열 내에 있는 숫자들을 하나씩 빼와서 계산하려 하였다.
그러다 찾은 풀이는 1~10000까지의 숫자들을 집합에 넣어두고
셀프 넘버인 숫자들을 구한 후 셀프 넘버들을 1~10000까지의 숫자들의 집합에서 빼는 것이었다.
set() 함수는 집합의 개념이라 합, 차, 곱이 가능하다는 것이 특징이다.
그리고 셀프 넘버가 아닌 숫자들은 숫자를 문자로 치환하여-> str(숫자)
숫자들을 하나하나 떼어내면 셀프 넘버가 아닌 수를 구할 수 있는 식이 나왔다.
각 자리의 숫자합의 결과들은 셀프 넘버 아님으로 not_self_num 집합에 넣어준다.
number_set = set(range(1, 10001)) # 문제에서 요구하는 숫자 범위
not_self_num = set() # 셀프 넘버가 아닌 수들을 저장할 집합
for i in range(1, 10001): # 1~10000까지 숫자들을 모두 돌며 셀프넘버가 아닌 수를 구한다.
for j in str(i): # 숫자를 문자로 치환해 하나하나 떼어낸 후
i += int(j) # 다시 숫자로 치환해 더한다.
not_self_num.add(i) # 결과 값은 셀프 넘버가 아니므로 not_self_num에 집어넣는다.
self_num = sorted(number_set - not_self_num) # 집합 함수는 차 집합이 가능하므로 전체 넘버set에서 셀프넘버가 아닌 집합을 빼준다.
for i in self_num:
print(i)
set() 함수