1. 답안
2. 풀이
<핵심 아이디어>
1. 생성자가 존재하는 숫자와 존재하지 않는 숫자(셀프 넘버)를 각각 리스트에 넣는다.
2. 전자(생성자가 존재하는 숫자들의 리스트)에서 후자(셀프 넘버)를 뺀다. → 차집합 개념
total_number_set = set(range(1,10001)) # 전체 숫자 집합 정의
not_self_number_set = set() # 생성자가 있는 숫자들의 집합 정의
우선적으로 다음과 같이 1부터 10,000까지의 숫자를 모두 리스트에 넣은 집합과 생성자가 있는 숫자들의 집합(공집합)을 정의한다.
for number in total_number_set:
for num in str(number):
number += int(num)
not_self_number_set.add(number)
그리고 생성자가 있는 숫자들의 집합을 리스트에 넣어주는데, 숫자를 문자화 시켜 반복문에 넣고, 다시 정수 타입으로 변경하여 계산하는 알고리즘으로 구성하였다. 각 숫자들은 not_self_number_set 집합에 차곡차곡 쌓이게 된다.
self_number_set = total_number_set - not_self_number_set # (전체 숫자 집합) - (생성자가 있는 숫자 집합)
for self_number in sorted(self_number_set): # 오름차순으로 정렬한 뒤 각 숫자들 출력
print(self_number)
그런 뒤에 전체 숫자에서 생성자가 있는 숫자 집합을 차집합하여 셀프 넘버로 구성된 집합을 얻는다.
그런데 이때, 파이썬의 집합은 순서 개념(index)가 없기 때문에 출력하기 전 sorted() 함수를 이용해 정렬을 해준 뒤에 요소들을 한줄 한줄 출력해줄 수 있도록한다.
그러면 문제에 주어진 예제 출력과 동일하게 출력되는 것을 확인할 수 있다.
'PS' 카테고리의 다른 글
[PS] 코딩테스트 SQL 정리 (0) | 2024.04.29 |
---|