public class Main {
public static void main(String[] args) {
boolean[] notSelfNumbers = new boolean[10001];
for (int i = 1; i < 10001; i++) {
int sum = d(i);
if (sum < 10001) {
notSelfNumbers[sum] = true;
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i < notSelfNumbers.length; i++) {
if (!notSelfNumbers[i]) {
sb.append(i).append("\n");
}
}
System.out.println(sb);
}
public static int d(int n) {
int sum = n;
while (n != 0) {
sum += (n % 10);
n /= 10;
}
return sum;
}
}
처음에 문제가 잘 이해되지않아 해맸던것같다.
출력문으로 봐서는 10,000 이하의 특정 수를 출력하는 것같았고
자세히 읽어보니 10,000보다 작은 셀프 넘버 즉, 생성자가 없는 숫자를 출력하는 것이다.
함수를 통해 생성되는 숫자는 생성자가 있는 것이므로 함수를 통해 생성된 숫자를 제외한 10,000 이하의 수를 출력하면 되는 문제이다.
함수부터 구현하면 입력받은 수를 통해 새로운 수를 생성하고 새로운 수를 반환한다.
int sum = n;
while (n != 0) {
sum += (n % 10);
n /= 10;
}
return sum;
주어진 수에 각 자릿수를 더해서 새로운 수를 생성하므로
n을 10으로 나눈 나머지 (각 자릿수)를 더하고
n을 10으로 나누는걸 반복하면 새로운 수가 생성된다.
ex) n = 1357
int sum = n; // sum = 1357 while (n != 0) { sum += (n % 10); // n % 10 = 7 | sum = 1357 + 7 n /= 10; // n = 135 } return sum; // 1357 + 7 + 5 + 3 + 1 = 1373
while
문을 통해 반복하면 n의 각 자리수가 sum에 더해지고
마지막에 n=0이 되어 반복문은 종료되고 새로운 수인 1373이 반환❗️
boolean[] notSelfNumbers = new boolean[10001];
for (int i = 1; i < 10001; i++) {
int sum = d(i);
if (sum < 10001) {
notSelfNumbers[sum] = true;
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i < notSelfNumbers.length; i++) {
if (!notSelfNumbers[i]) {
sb.append(i).append("\n");
}
}
System.out.println(sb);
함수는 구현됬으므로 나머지는 boolean타입의 배열에 생성된 수의 위치에 true
값을 입력하게되면 10,000 이하의 생성자가 있는 수 (셀프넘버가 아닌 수)의 배열이 만들어지고 false
값 만 출력하면 셀프넘버가 출력된다.
처음에 이해가 안될 때는 고민하다가 풀리기 시작하니까 재밌게 풀 수 있는 문제였다 😁