더 좋은 문제 풀이가 있거나 궁금하신 점이 있다면 편하게 댓글 남겨주세요!
저는 처음 문제를 읽고 어떻게 문제를 풀어야 될지 감도 잡히지 않았습니다. 두세번 읽었는데도 문제가 이해가 되지 않아 구글링을 통해 셀프 넘버의 개념을 이해했습니다. 그럼 제가 이해한 내용을 정리해보겠습니다.
생성자가 없는 숫자를 셀프 넘버라고 합니다. 그렇다면 생성자란 무엇일까요?
생성자는 자기 자신과 각 자리 수를 더한 숫자입니다. 아래의 예시를 살펴보며 이해해 보겠습니다.
1+1 = 2 // (자기 자신) 1 + (각 자리 수) 1 = 2
2+2 = 4 // (자기 자신) 2 + (각 자리 수) 2 = 4
3+3 = 6
4+4 = 8
5+5 = 10
6+6 = 12
7+7 = 14
8+8 = 16
9+9 = 18
10+1+0 = 11
11+1+1 = 13
12+1+2 = 15
13+1+3 = 17
14+1+4 = 19
15+1+5 = 21
16+1+6 = 23
17+1+7 = 25
.....
100+1+0+0 = 101 // (자기 자신) 100 + (각 자리 수) 1 + 0 + 0 = 101
즉 위의 예시를 제외한 숫자가 셀프 넘버입니다.
문제를 푸는 방법은 먼저 10000 크기의 배열을 생성하고 인덱스를 돌며 생성자를 체크합니다. 마지막으론 다시 반복문을 돌며 배열에 체크가 안된 인덱스 즉, 셀프 넘버를 찾아 출력하는 것입니다.
이 방법은 에라토스테네스의 체라고도 불린다고 합니다.
에라토스테네스의 체는 가장 먼저 소수를 판별할 범위만큼 배열을 할당하여, 해당하는 값을 넣어주고, 이후에 하나씩 지워나가는 방법을 이용합니다.
알고리즘에서 중요한 개념이니 만큼 이번 기회에 제대로 이해하고 넘어가는 것이 좋을 것 같습니다.
StringBuilder란? StringBuilder 사용법
저는 Java에서 문자열 하면 String 만 떠올렸습니다. 하지만 오늘은 StringBuilder에 대해 알아보고자 합니다. String은 한 번 생성되면 내용을 바꿀 수 없어 다른 문자열과 연결하기 위해서는 기존 문자열은 버리고 새로운 문자열을 생성합니다. 이런 문제를 해결하기 위해 StringBuilder가 사용됩니다. StringBuilder는 변경 가능한 문자열을 만들기 때문에 String을 합치는 작업에 적합합니다. 아래의 예시를 통해 StringBuilder에 대해 더 자세히 알아보겠습니다.
StringBuilder sb = new StringBuilder(); //문자열 크기를 자동으로 추가하기 때문에 초기 생성자에 크기값을 줄 필요가 크게 없다.
sb.append("aaa ");
sb.append("bbb ").append("ccc");
System.out.println(sb); //aaa bbb ccc
String str = sb.toString(); // String에 StringBuilder를 그대로 넣을 순 없다. toString()을 붙여야 한다
System.out.println(str); //aaa bbb ccc
public class Main {
public static void main(String[] args) {
int index = 10000;
boolean[] number = new boolean[index];
for(int i=0; i<number.length; i++) {
if(d(i+1) < index+1)
number[d(i+1)-1] = true;
}
//셀프 넘버 출력 부분
StringBuilder sb = new StringBuilder();
for(int i=0; i<number.length; i++) {
if(number[i] == false) {
sb.append(i+1).append('\n');
}
}
System.out.println(sb);
}
public static int d(int num){
int sum = num;
while(num !=0){
sum = sum + (num % 10);
num = num / 10;
}
return sum;
}
}