#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.
#include <iostream>
using namespace std;

int d(int n) { // 자리수 더하는 함수
  int sum = n;
  while(n != 0) {
    sum += n%10; // 1의 자리수 더하기
    n = n / 10; // 첫번째 자리수 제거함
  }
  return sum;
}  

int main() {
  int i, v;
  int check_n[10001] = {0};
  // 생성자있는 값을 체크하기 위해 0으로 초기화된 배열 생성
  for(i = 0; i < 10000; i++) {
    v = d(i);
    if(v < 10001) { // 10001 이상은 조건에 따라 기록 안함
      check_n[v] = 1; // v 는 셀프넘버가 아님을 표시
    }
  }
  
  // 루프를 돌려서 리스트에서 셀프넘버를 체크해 출력
  for(i = 0; i < 10001; i++) {
    if(check_n[i] ==0) cout << i << endl; // 셀프넘버 출력
  }
  return 0;
}
© 코드솔 - CodeSol. All Rights Reserved.