Coding/Baekjoon

[백준] 단계별로 풀어보기 - 6. 함수 (python3) (4673)

jir4vvit 2022. 1. 11. 22:53

 

 

6단계인 함수에서는 3문제밖에 없는데, 뭔가 문제 해석하기도 힘들었고 생각을 조금 오래한 문제가 있다.

(어려운건 아닌데, 문제를 되게 여러번 읽었다.)

 

 

4673번 셀프 넘버 (링크)

 

4673번: 셀프 넘버

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

www.acmicpc.net

33 -> 33 + 3 + 3 = 39

39 -> 39 + 3 + 9 = 51

51 -> 51 + 5 + 1 = 57

..

이런식으로 수열을 만들 수 있는데, 33으로 시작하면 33, 39, 51, 57, 69 .. 이런식으로 이어진다고 한다.

이 개념이 바로 생성자이고, 생성자가 아닌 수를 셀프넘버라고 한다.

우리는 이제 셀프 넘버를 출력하는 함수를 만들어야 한다..

 

 

내 풀이

def  make():
    con = []
    for i in range(1,10001): # i가 36일때 예시
        for k in str(i):
            i += int(k) # 36 + 3 + 6
        if i < 10001:
            con.append(i)
        else:
            pass
    return set(con)

def myPrint(num):
    for i in sorted(num):
        print(i)

def is_selfnum():
    con = make()
    num = set(range(1,10001))
    self = num - con		# 주목!!!!!
    myPrint(self)

is_selfnum()

지금 보니깐.. 함수명이 좀 마음에 안드는데.. is_selfnum  함수 이름을 그냥 selfnum으로 바꾸고 싶다.

 

아무튼.. 무시하고 코드를 살펴보면 먼저 make함수로 생성자를 만들어 준다. 

 

자세한 것(?)은 주석을 참고하고..  return할 때 set(con)을 해줌으로써 중복을 없애주었다.

 

다시 is_selfnum 함수를 살펴보면, set을 이용해서 1부터 10000까지 수를 num에 넣어주고

num과 con을 빼는 것을 볼 수 있는데 (혹시 몰라서 해봤는데 진짜 되어서 놀랐다.)

 

이렇게하면

{1, 2, 3, 4, 5} - {1, 3, 5} = {2, 4}

이런식으로 뺄셈이 가능하다.

 

그러고 이걸 sorted를 이용해서 정렬한 다음에 순서대로 print해주면 끝!

 

남의 풀이 (출처 : https://jeongmin-lee.tistory.com/52?category=769134)

list1=list()
def d(N):  
    for j in str(N):
        N += int(j)
    list1.append(N)
    
for i in range(1,10001): 
    d(i)
    if i not in list1:
        print(i)

생성자를 구하는건 나와 동일한 알고리즘이다.

 

하지만 셀프넘버를 출력할 때 훨씬 간결한데. (사실 내가 저렇게 하고 싶었는데 제대로 안됐다.T_T)

 

list1에는 for문을 돌면서 각 i의 생성자들이 리스트형태로 계속 저장될 것이고, i가 list1에 없으면 출력을 해준다.

range(11)으로 해두고 출력 테스트를 해보면 아래와 같다.

1 [2] # i, list1
1
2 [2, 4]
3 [2, 4, 6]
3
4 [2, 4, 6, 8]
5 [2, 4, 6, 8, 10]
5
6 [2, 4, 6, 8, 10, 12]
7 [2, 4, 6, 8, 10, 12, 14]
7
8 [2, 4, 6, 8, 10, 12, 14, 16]
9 [2, 4, 6, 8, 10, 12, 14, 16, 18]
9
10 [2, 4, 6, 8, 10, 12, 14, 16, 18, 11]