python/연습문제 풀이

[백준] Python 4673번 셀프 넘버

연정양 2023. 1. 19.

 

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문을 돌렸다. 

댓글