Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

냥코센세이

[백준] 4673 셀프 넘버 (파이썬) 본문

백준/단계별로 풀어보기

[백준] 4673 셀프 넘버 (파이썬)

yangko 2022. 8. 11. 14:03

이번에는 함수 2번째 문제인 셀프 넘버를 풀어봤다.

여기서는 생성자를 출력하는 게 아니라 셀프 넘버를 출력해야 하는데 처음 감을 못 잡다가 

저번에 풀어본 백준 2231번 분해합 문제에서 아이디어를 착안해보았다.

 

분해합에서는

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성했었는데 내 수준으로는 이 문제도 조금 시간이 걸렸다.

 

분해합을 먼저 풀어보고 이 셀프 넘버 문제를 보니 비슷해 보였다.

내가 푼 문제는 이러하다.

lst = [] #생성자
result = [x for x in range(1,10001)] #셀프넘버
for i in range(1,10001):
  n = list(map(int,str(i)))
  num = i+sum(n)
  lst.append(num)
#print(list(set(lst))) #생성자 리스트
self_num = sorted(list(set(result)-set(lst)))
for j in range(len(self_num)):
  print(self_num[j])

우선 생성자 리스트를 만들어 주고 1부터 10000까지의 숫자가 담긴 리스트를 만든다.

그러고 for문을 이용해 10000자리 까지 반복하게 해주고 분해합에서 사용한 map을 이용해 가능한 가짓수를 전부 리스트로 만들어 n에 저장한다.

그러고 i와 i의 각자리 수 합을 더해 num에 저장해주고, 이 num값을 lst에 추가해준다.

 

주석은 생성자 리스트가 어떻게 생성되었는지 보려고 적어놓은 것이고, 

저 주석을 출력해 보면 10000보다 작거나 같은 생성자들이 1부터 계산이 되어 [2, 4, 6, 8, 10, 11, 12...]처럼 쭉 출력이 된다.

따라서 이 생성자들을 1부터 10000까지 생성된 리스트에서 제거를 해주면 그 값이 비로소 셀프 넘버가 된다. 

 

그래서 self_num을 보면 각 리스트들을 집합으로 만들어 준다음 빼주었고, 다시 리스트로 만든 다음 sorted를 이용해 오름차순 정렬을 해주었다. 문제에서는 리스트가 아니라 하나하나씩 출력이 되길 원했기 때문에 for구문을 이용해 셀프 넘버들을 하나씩 출력해 주었다.