python/연습문제 풀이

[백준] Python 4673번 셀프 넘버

연정양 2023. 1. 19.

목차

    [백준] Python 4673번 셀프 넘버

     

    4673번: 셀프 넘버

    셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,...

    www.acmicpc.net

    def d_n():
            non_self = []
            for i in range(10000) :
                if len(str(i)) == 1:
                    a = i + i
                    non_self.append(a)
    
                elif len(str(i)) == 2:
                    b = str(i)
                    a = i + int(b[0]) + int(b[1])
                    non_self.append(a)
    
                elif len(str(i)) == 3:
                    b = str(i)
                    a = i + int(b[0]) + int(b[1]) + int(b[2])
                    non_self.append(a)
    
                else:
                    b = str(i)
                    a = i + int(b[0]) + int(b[1]) + int(b[2]) + int(b[3])
    
                    if len(str(a)) <= 4:
                        non_self.append(a)
    
            return non_self
    
    non_self_num = d_n()
    
    for j in range(10000):
        if j not in non_self_num:
            print(j)

     

    1) 입력은 없으므로 10000을 바로 넣었다 (사용자 정의 함수는 후에도 사용할 수 있으므로 권장하는 방법은 아님) 

    2) int 에서 자릿수를 분리해야 한다 -> str로 변환 후 len으로 자릿수를 읽음 

    3) 1의 자리, 10의 자리, 100의 자리, 1000의 자리 이상 4개 경우로 나누어야 한다

    4) non_self_number가 10000 이상(자릿수 4 이상)일 경우 제외해야한다 -> 4 이하만 append 했음 

    5) str로 변형 후 indexing을 통해 숫자를 분리하고, 이를 다시 int로 변환해서 i(원래 넘버) 에 더해준다.

    6) 리스트 간 비교가 필요하기 때문에 빈 리스트 정의 후 append로 하나씩 넣어야 한다

    7) 1부터 10000까지의 리스트에서 non_self_number를 제외하면 셀프 넘버가 나온다

    8) 사용자 정의 함수 d_n()을 for문 안에 바로 넣어도 작동은 되지만, 소요 시간이 눈에 띄게 길어지기에 변수에 넣어서 for문을 돌렸다.