백준 4673번 파이썬

iillyy·2021년 3월 11일
0

알고리즘

목록 보기
3/13
post-thumbnail

한 번 풀었는데 까먹어서 다시 풀어본 문제..
사실 그런 문제가 많다

문제는


자기 자신과 각 자리의 수들을 더해서 나온 값을 d(n)이라고 할 때
n 은 생성자라고 합니다.
여기서 n이 없는 값이 셀프 넘버라고 합니다.
그래서 n과 각 자리의 수를 더해서 나온 값들은 셀프 넘버가 될 수 없습니다.

def self():
    n = 0
    li = []
    for i in range(0,10001):
        if i < 10:
            n = i + i
            li.append(n)
        
        elif i < 100:
            n = i + i//10 + i%10
            li.append(n)
        
        elif i < 1000:
            n = i + i//100 + (i%100)//10 + i%10
            li.append(n)
        
        elif i < 10000:
            n = i + i//1000 + i%1000//100 + i%100//10 + i%10
            li.append(n)
            
            if n <= 10001:
                li.append(n)

            li.sort()
    for j in range(0,10001):
        if j not in li:
            print(j)

self();
            

저는 단순하게 생각해서 노가다를 했습니다.
1부터 10001까지 리스트 중에서 셀프 넘버가 아닌 수들을 빼자!
여기서 셀프 넘버가 아닌 수는 일의 자리, 십의 자리로 더해진 수들이겠죠?
그래서 자기 자신과 각 자리로 분해한 수를 더한 값들은 1부터 10001까지의
리스트에서 빼주면 되는 겁니다.

그래서 10의 자리 단위로 나누어 10보다 작을 때, 100보다 작을 때,
1000보다 작을 때, 10000보다 작을 때를 나누어 각 자리를 몫과 나머지로 계산하여
더했습니다.

이 문제는 사실 함수를 쓰지 않아도 정답처리되는 문제입니다.
함수에서 포문들을 꺼내서 포문으로만 계산해도 맞더라고요

문제가 함수에 속해 있어 함수를 사용했는데 왜 함수를 사용해야만 했는지는
더 경험이 쌓이면 알게 되겠죠..?

0개의 댓글