6단계인 함수에서는 3문제밖에 없는데, 뭔가 문제 해석하기도 힘들었고 생각을 조금 오래한 문제가 있다.
(어려운건 아닌데, 문제를 되게 여러번 읽었다.)
4673번 셀프 넘버 (링크)
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]
'Coding > Baekjoon' 카테고리의 다른 글
[백준] 단계별로 풀어보기 - 5. 1차원 배열 (python3) (8958) (0) | 2022.01.11 |
---|---|
[백준] 단계별로 풀어보기 - 4. while문 (python3) (10951, 1110) (0) | 2022.01.06 |
[백준] 단계별로 풀어보기 - 3. for문 (python3) (15552, 11022, 2438, 2439, 10871) (0) | 2022.01.05 |
[백준] 단계별로 풀어보기 - 2. if문 (python3) (2884) (0) | 2022.01.05 |
[백준] 단계별로 풀어보기 - 1. 입출력과 사칙연산 (python3) (0) | 2022.01.04 |