a=[] # 셀프넘버 저장
b=[] # 리스트a가 아닌 숫자 저장
for i in range(1,10000):
if(i<=99): #99
a.append(i+(i//10)+(i%10))
elif(i<=999): #999
a.append(i+(i//100)+((i//10)%10)+(i%10))
elif(i<10000): #9999
a.append(i+(i//1000)+((i//100)%10)+((i%100)//10)+(i%10))
a.sort()
for i in range(1,len(a)):
if(i not in a): #리스트a가 아니면 b에 추가
b.append(i)
for i in range(len(b)):
if(b[i]<=10000): #9999까지만 출력
print(b[i])
나는 1~10000까지 자릿수에 맞춰 범위를 나눴다.
그리고 거스름돈 알고리즘 문제(?)처럼 자릿수를 하나하나 쪼개 더해주고 리스트a에 넣은다음 리스트b에 리스트a에 없는 숫자만을 프린트하도록 코드를 짜보았다.
다른사람들은 어떻게 짰나 봤는데 너무나 효율적이게...파이썬의 str내장함수를 사용하여 숫자 자릿수를 쪼개는 것을 보고 너무 놀랐다.
하나 배워갑니다...
natural_num = set(range(1, 10001))
generated_num = set()
for i in range(1, 10001): #i= 850
for j in str(i): # j= "8", "5", "O"
i += int (j) # 850 + 8+ 5 +0, 1 = 863
generated_num. add (i) # 생성자가 있는 숫자들
self_num = sorted (natural_num - generated_num)
for i in self_num:
print(i)
이 코드는 처음부터 set으로 감싸 숫자 중복을 없앴고,
for문에서 str(i)로 반복문을 써서 숫자 자릿수를 원래숫자에 더해주었다.
나는 생각도 못했던 내장함수 사용...
그리고 나는 리스트를 두개 만들어 셀프 넘버를 제외시켰는데,
여기선 sorted 내장함수를 씀과 동시에 '-(빼기)'로 제외시켰다.
여러 내장함수의 활용을 배웠다.
set: 중복제거
sort: 정렬 (중복제거는 안해줌)
-(빼기): 튜플끼리 뺄 수 있다