#44. 백준 4673번 문제 풀이: 셀프 넘버 문제 원본 보기
셀프 넘버는 인도수학자가 이름을 붙였다. d(n) 을 n과 n의 각 자리수를 더하는 함수라 하자. 예) d(75) = 75+7+5=87 양의 정수 n이 주어졌을 때, n, d(n), d(dn)),.. 10000 이하의 셀프 넘버를 한 줄에 하나씩 출력하세요.
입력/출력
--입력--
없음
--출력--
1
3
5
7
9
20
31
42
53
64
 |
 |       <-- a lot more numbers
 |
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993
문제풀이+해설
셀프 넘버를 직접 계산하는 공식에 대한 설명이 없다.
그러므로 문제의 의도에 따라 10000 까지 생성자가 있는 수를 표시해 두고, 표시 되지 않은 수를 셀프넘버로 출력하는 방법을 사용하면 된다.
--
배열[10001] # 배열 인덱스값을 정수로 간주해서, 생성자가 있는 수를 인덱스로 1값을 넣어준다.
for 1부터 10000까지:
  배열[생성자생성함수 리턴값] = 1
배열에서 1이 아닌 값은 셀프함수이므로 루프를 돌려 출력
-- 
code sol.
def d(n): # 자리수 더하는 함수
  sum = n
  while n != 0:
    sum += n%10 # 1의 자리수 더하기
    n = n // 10 # 첫번째 자리수 제거함
  return sum
    
check_n = [0]*10001
# 생성자있는 값을 체크하기 위해 0으로 초기화된 리스트 생성
for i in range(1, 10000):
  v = d(i)
  if v < 10001: # 10001 이상은 조건에 따라 기록 안함
    check_n[v] = 1 # v 는 셀프넘버가 아님을 표시

# 루프를 돌려서 리스트에서 셀프넘버를 체크해 출력
for i in range(1, 10001):
  if check_n[i] ==0: # 셀프넘버
    print(i) # 출력
© 코드솔 - CodeSol. All Rights Reserved.