Python 알고리즘 - 셀프 넘버

셀프 넘버

  • 자기 자신과 각 자릿수를 더하는 함수를 구현하고, 자기 자신에 대한 생성자가 없는 넘버를 셀프 넘버라고 한다.

1. 10000이하의 셀프넘버를 모두 출력하려면 일단 생성자를 가진 수를 구하는 함수 d(n)을 구해야한다.

2. 1부터 함수에 넣어서 나오는 값의 index에 False를 넣을 것이다.

3. 단 d(n)값이 10000 초과이면, break하고, 다음 수의 d(n)을 탐색한다. 만약 배열 값이 False이면 continue하도록 한다.

4. 마지막에 True 값만 남은 인덱스 값을 출력한다.

여기서 생각해볼 점은 오류를 방지하려면 리스트 공간을 10000개가 아니라 더 크게 만들고 코드를 안전하게 짜도 무방해보인다.

정답이지만 모범 답안은 아니다.

#flag를 꽂을 리스트 10000개
num_list = [True for i in range(1, 10001)]

# 각 자릿수 이므로 몇 자릿 수인지 판별
def d(n):
    while True:
        num = 0
        #1의 자릿수일 떄,
        if n // 10 == 0:
            num = n + n
            num_list[num] = False
            break
        # n이 10의 자릿수 일 때,
        elif n // 100 ==0:
            num = n + (n //10)%10 + n%10
            num_list[num] = False
            break
        # n이 100의 자릿수 일 때,
        elif n // 1000 ==0:
            num = n + (n//100)%10 +(n //10) %10 + n%10
            num_list[num] = False
            break
        # n이 1000의 자릿수 일 때, 9999를 넣으면 10000을 넘는 것 예외처리
        elif n // 10000 ==0:
            num = n + (n//1000)%10 + (n//100)%10 +(n //10) %10 + n%10
            if num >= 10000:
                break
            else:    
                num_list[num] = False
                break
        elif n ==10000:
            num_list[num] = False
            break
for i in range(1, 10001):
        d(i)

result_list = list(filter(lambda x: num_list[x] == True, range(len(num_list))))

for i in result_list:
    print(i)
    

모범 답안

list_num = set(range(1, 10001))
new_num = set()

for i in range(1, 10001):
    for j in str(i): #각 자릿수를 문자 단위로 쪼갬. 850이면, 8 5 0
        i +=int(j) # i 와 다시 int로 변환한 각 자릿수.
    new_num.add(i)

result_num = sorted(list_num - new_num) # 원래 배열에서 생성자가 있는 수를 차집합으로 지움.
for i in result_num:
    print(i)

좋은 웹페이지 즐겨찾기