https://www.acmicpc.net/problem/4673
우선 자리수를 각 나누어서 합을 구하는 함수 d를 먼저 구현해준다.
원래 숫자를 sum에 먼저 저장하고 자리수를 나누어서 각각 sum에 더해준다.
main 함수로 돌아와서 셀프넘버를 체크할 수 있는 boolean 배열을 만든 후 1~10000까지 생성자를 구한다. (d(i))
그리고 return 받은 sum(=number)가 10000보다 작은 숫자라면 해당 배열 index에 true를 저장한다.
배열을 다시 반복문으로 돌려서 각각의 값이 true가 아닌 경우 StringBuilder에 index를 append한 후, 반복문을 빠져나와서 StringBuilder를 출력한다.
간략하게 설명하면 하단의 표와 같다.
| i | d(i)=number | check[number] |
|---|---|---|
| 1 | 1+1+0=2 | check[2]=true |
| 2 | 2+2+0=4 | check[4]=true |
| 3 | 3+3+0=6 | check[6]=true |
이렇게 check배열이 채워질 것이고, check[1], check[3], check[5]는 true 값이 없기 때문에(숫자의 합이 도출되지 않음) 셀프 넘버이다.
그래서 i값 즉, check배열의 index값을 출력해주면 된다.
public class Q_4673_ver2 {
public static void main(String[] args) {
boolean[] check = new boolean[10001];
for(int i = 1; i < check.length; i++) {
int number = d(i);
if(number < 10001) {
check[number] = true;
}
}
StringBuilder sb = new StringBuilder();
for(int i = 1; i < check.length; i++) {
if(! check[i]) {
sb.append(i + "\n");
}
}
System.out.println(sb);
}
static int d(int num) {
int sum = num;
while(num != 0) {
// 첫째 자리수
sum += (num % 10);
// 나머지 자리수
num = num / 10;
}
return sum;
}
}