'''
# d(75) = 75 + 7 + 5 = 87
# 이렇게 하려면 int로 받고 str로 쓰기
a = int(input())
b = str(a)
print(b[0])
# 입력 : 867
# 출력 : 8
'''
# d(75) = 75 + 7 + 5 = 87
# 이걸 함수로 만들어야 함
def d(n) : # 셀프넘버 생성해주는 함수 만들기
n = n + sum(map(int, str(n)))
# 이것저것 해보다가 sum(map(int, str(n)))이 된다는 것 찾음 - int로 받고 str로 쓰기
# 위 식을 해석하면, d(75) = 75 + (7 + 5) = 87이라는 뜻
return n # 문제의 설명대로 n에 저장하고 return
numbers = list(range(1, 10001)) # 1부터 10,000까지의 숫자
Snumbers = [] # 생성자가 들어갈 리스트
for i in range(len(numbers)) : # numbers 변수에서
Snumbers.append(d(i)) # d(n)함수를 이용해 생성자를 찾아서 Snumbers에 추가
for j in range(len(numbers)) :
# Snumbers 출력해보면 10035까지 나오는데
# 우리가 알고 싶은 건 10,000까지니까 10,000까지만 지정
# 직관적으로 보이기 위해 range(1, 10001)이 아니라 그냥 len(numbers)라고 함
if j not in Snumbers : # 1~10,000까지의 숫자 중 Snumbers에 없는 숫자
# 즉, 생성자가 아닌 숫자 = 셀프넘버
print(j) # 출력
''' 다른 코드 (1)
visited = [False for i in range(10010)]
def nxt(x):
ret = x
while x > 0:
ret += x % 10
x //= 10
return ret
for i in range(1, 10000):
x = nxt(i)
while x <= 10000 and not visited[x]:
visited[x] = True
x = nxt(x)
for i in range(1, 10001):
if not visited[i]:
print(i)
'''
''' 다른 코드 (2)
lst = set([i for i in range(1,10001)])
notSelf = set()
sum = 0
for i in lst:
for j in str(i):
sum += int(j)
if sum+i in lst:
notSelf.add(sum+i)
sum = 0
for k in sorted(lst - notSelf):
print(k)
'''
''' 다른 코드 (3)
not_self = [True]*10001
for i in range(1,10001):
tmp = i
s = str(i)
for j in range(len(s)):
tmp += int(s[j])
if tmp<=10000:
not_self[tmp]=False
for i in range(1,10001):
if not_self[i]:
print(i)
'''
'아카이브 > 백준문제풀이' 카테고리의 다른 글
[백준/python3] 2798_블랙잭(brute force) (0) | 2022.01.16 |
---|---|
[백준/python3] 2775_부녀회장이 될테야 (0) | 2022.01.16 |
[백준/python3] 5622_다이얼 (0) | 2022.01.13 |
[백준/python3] 5054_주차의 신 (0) | 2022.01.13 |
[백준/python3] 4435_중간계 전쟁 (0) | 2022.01.12 |