https://www.acmicpc.net/problem/4673
import java.util.*;
class Main {
public static void main(String[] args) {
boolean[] check = new boolean[10001];
for (int i = 1; i < 10001; i++) {
// 1. i + (i의 각 자리수 합 )구하기
int notSelf = i;
String[] str = String.valueOf(i).split("");
for (int j = 0; j < str.length; j++) {
notSelf += Integer.valueOf(str[j]);
}
if (notSelf > 10000) {
continue;
}
// 2. self가 아닌 인덱스를 true로 변경
check[notSelf] = true;
}
//3. self가 아닌 수를 출력
StringBuilder sb = new StringBuilder();
for (int i = 1; i < 10001; i++) {
if (!check[i]) {
sb.append(i).append(System.lineSeparator());
}
}
System.out.println(sb);
}
}
d(n)
은 자기 자신 + 각 자리수의 합
을 의미한다.check
라는 boolean배열로 판단한다.구체적인 단계는 다음을 따른다.
- 먼저 첫번쨰 for문을 돌며
i
에 대한 d(n)을 구한다check
배열에 그 수에 해당하는 인덱스의 값을true
로 변경한다.- 위 1, 2번을
i <= 10000
일 때 까지 수행한다.- 위 for문에서 갱신된
check
배열을 순회하며 값이false
인 인덱스만StringBuilder
에 담은 후 출력한다. 그 값이 곧 문제의 셀프넘버를 의미한다.
d(d(n)), d(d(d(n))), ....
의 조건에 해당하는 수만 구하는 것이 아닌 1이상 10,000이하의 수에서 모든 d(n)을 구할 수 있는 경우를 구해야 한다.String
으로 형변환해서 각 자리수를 구하고, 그것을 다시 int
로 형변환해서 각 자리수의 합을 구하는 방법으로 해결했었다.import java.util.*;
class Main {
public static void main(String[] args) {
boolean[] check = new boolean[10001];
for (int i = 1; i < 10001; i++) {
// 1. i + (i의 각 자리수 합 )구하기
int notSelf = getNotSelf(i);
if (notSelf > 10000) {
continue;
}
// 2. self가 아닌 인덱스를 true로 변경
check[notSelf] = true;
}
// 3. self가 아닌 수를 출력
StringBuilder sb = new StringBuilder();
for (int i = 1; i < 10001; i++) {
if (!check[i]) {
sb.append(i).append(System.lineSeparator());
}
}
System.out.println(sb);
}
static int getNotSelf(int num) {
int ret = num;
while (num > 0) {
ret += num % 10;
num = num / 10;
}
return ret;
}
}