문제
셀프 넘버는 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보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
#백준 4673
def d(n):
next = n #계산 결과 저장
for value in list(str(n)): #숫자를 문자열로 하나씩 분리
next += int(value) #문자열을 다시 숫자로 변환
return next
excep = [] #생성자가 있는 수 리스트
for count in range(10001):
excep.append(d(count)) #생성자가 있는 수 저장
excep.sort() #생성자가 2개 있는 경우가 있기 때문에 정렬하여 구분
for count in range(1,10000):
if count in excep:
continue
else:
print(count)
문제가 수록된 주제는 함수 사용이기 때문에 문제에서 제시된 d() 함수를 만들었습니다.
d() 함수는 셀프 넘버가 아닌 수들을 찾아냅니다.
셀프 넘버는 생성자가 없는 수이기 때문에 d() 함수에서 만들어지지 않는 수들에 해당합니다.
리스트 excep은 셀프 넘버가 아닌 수(생성자가 있는 수)들을 저장합니다.
첫 for문을 통해 1~10000의 생성자로 만들어지는 수들을 찾아냅니다. (d() 함수 사용)
d() 함수 처리가 종료된 이후에는 리스트에 동일한 값이 존재하기 때문에 정렬 함수인 sort()
를 사용하여 리스트에 저장된 내용을 정리합니다.
마지막 for문으로 1~9999의 값 중 셀프 넘버인 수만을 출력합니다.
셀프 넘버를 찾아내는 방법은 excep에 존재하지 않는 수들만을 출력시키는 조건을 만드는 것입니다.
-끝-
'작업 > Problem Solving' 카테고리의 다른 글
백준 10809(알파벳 찾기) 파이썬(python) 해결 (0) | 2020.07.27 |
---|---|
백준 1065(한수) 파이썬(python) 해결 (0) | 2020.07.26 |
백준 4344(평균은 넘겠지) 파이썬(python) 해결 (0) | 2020.07.24 |
백준 2577(숫자의 개수) 파이썬(python) 해결 (0) | 2020.07.23 |
백준 2523, 2446, 10996(별 찍기 13, 9, 21) 파이썬(python) 해결 (0) | 2020.07.22 |