본문 바로가기
python3/백준문제풀이

[백준/python3] 4673_셀프 넘버(brute force)

by MeaninGood 2022. 1. 15.

 

'''
# 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)

'''