1 부터 10000까지 검사한 뒤, 해당 수를 생성자로 하는 수가 있으면 그 수를 거르는 방법으로 문제를 해결하였다. 함수 부분의 반복문에서 다른 사람의 코드를 참고하였다.
* 구조
1. 1부터 10000까지 반복문을 돌면서 d함수에 숫자를 넣고, return 되는 수는 해당 숫자를 생성자로 하는 수가 된다.
2. return 된 수는 생성자가 있는 수, d 함수에 의해 리턴된 수 n 을 boolean 배열의 인덱스로 사용하여 해당 위치를 true 로 바꾸어 준다.
3. boolean 배열에서 false 인 원소의 위치(인덱스)를 출력한다.
public class Main {
public static void main(String[] args) {
boolean[] check = new boolean[10001]; // 1부터 10000이므로
for (int i = 1; i < 10001; i++){
int n = d(i);
if(n < 10001){ // 10000 이하의 수만 필요
check[n] = true;
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i < 10001; i++) {
if (!check[i]) { // false 만 출력
sb.append(i).append('\n');
}
}
System.out.println(sb);
}
public static int d(int number){
int sum = number;
while(number != 0){
sum = sum + (number % 10); // 첫 째 자리수
number = number/10; // 10을 나누어 첫 째 자리를 없앤다
}
return sum;
}
}
https://www.acmicpc.net/problem/4673
참고 : https://st-lab.tistory.com/53