문제 링크 >> https://www.acmicpc.net/problem/4673
📋 문제
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다.
양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자.
예를 들어, d(75) = 75+7+5 = 87이다.
양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.
예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
n을 d(n)의 생성자라고 한다.
위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다.
생성자가 한 개보다 많은 경우도 있다.
예를 들어, 101은 생성자가 2개(91과 100) 있다.
생성자가 없는 숫자를 셀프 넘버라고 한다.
100보다 작은 셀프 넘버는 총 13개가 있다.
1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
👉 입력
입력은 없다.
👈출력
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
📝 풀이
def selfNum(n):
sum = n
while True:
if n == 0:
break
sum += n % 10
n = n//10
return sum
num = set()
notselfNum = set()
for i in range(1,10001):
num.add(i)
temp = selfNum(i)
if temp <= 10000:
notselfNum.add(temp)
print(*sorted(num-notselfNum), sep='\n')
문제를 보자마자 생각난 건 차집합이었다.
1부터 10000까지의 수를 담은 집합에서 셀프 넘버가 아닌 수들을 모은 집합을 빼 셀프 넘버만 있는 집합을 구하는 것이다.
따라서 셀프 넘버인지 판별할 함수 selfNum을 선언했다.
selfNum에서는 수를 인자로 받아 sum을 계산하는데 이때 n이 0이될 때까지 10으로 나누고 나눈 나머지들을 하나씩 sum에 더해 수를 만들었다.
그리고 이 수들 중 10000이 넘지 않는 것들을 notselfNum이라는 집합에 넣는다.
셀프 넘버가 아닌 것들을 구하는 작업이 끝났다면 1부터 10000까지의 수를 담은 집합 num에서 이들을 뺀 것을 한 줄에 하나씩 출력한다.
'Algorithm > Python' 카테고리의 다른 글
[백준1181번] 단어 정렬 (0) | 2022.02.04 |
---|---|
[백준2805번] 나무 자르기 (0) | 2022.02.03 |
[프로그래머스] H-Index (0) | 2022.02.03 |
[프로그래머스] 가장 큰 수 (0) | 2022.02.02 |
[프로그래머스] K번째 수 (0) | 2022.02.02 |
댓글