본문 바로가기
Python/코딩도장 풀이 모음

[코딩도장] [Lv.2] 넥슨 입사문제 중에서

by Dailybook406 2022. 5. 9.

[ 문제 ]

어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.

예를 들어
d(91) = 9 + 1 + 91 = 101​

이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.

어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.

1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

 

[ 풀이 ]

# My solution
generator_list = []    #1

for i in range(1, 5000) :    #2
    add_num = []
    for j in str(i) :    #3
        add_num.append(j)
    add_num.append(i)    #4
    generator_list.append(sum(map(int,add_num)))    #5

self_num = {x for x in range(1,5000)} - set(generator_list)    #6

print(sum(self_num))    #7

실행결과

1227365
더보기
# 베스트 풀이 방법
sum(set(range(1, 5000)) - {x + sum([int(a) for a in str(x)]) for x in range(1, 5000)})

#1

1~5000 미만까지의 제네레이터를 담을 리스트(generator_list)를 생성

 

#2

d(n)의 식을 적용하여 제네레이터를 구하는 식

 

#3

입력받은 n의 각자리 숫자를 'add_num(제네레이터를 구하기 위해 더해야 할 숫자들)' 리스트에 추가

 

#4

입력받은 n을 'add_num' 리스트에 추가

 

#5

'add_num' 리스트의 총합(n을 통해 도출한 제네레이터)을 제네레이터 리스트에 추가

'add_num' 속에 있는 값들을 map함수를 이용해 int(정수)로 변환한 후, sum함수를 이용해 덧셈

 

#6

셀프넘버의 집합 생성

1~5000 미만의 숫자 집합을 생성한 후, set함수를 이용해 'generator_list'를 집합으로 변환하여 둘의 차집합을 구함.

 

#7

셀프넘버 집합의 총합을 구함

 


https://codingdojang.com/scode/365?answer_mode=hide 

 

코딩도장

프로그래밍 문제풀이를 통해서 코딩 실력을 수련

codingdojang.com

 

댓글