문제 출처 https://www.acmicpc.net/problem/4673
내가 작성한 코드
package baekjoon04;
public class back4673 {
public static int self_number(int n) {
int sum=n; //들어온 값을 먼저 sum에 넣어준다.
while(n!=0) {
sum = sum + (n%10); //일의 자리부터 하나씩 더하기
n = n/10; //10으로 나누면서 더한 값 버리기
}
return sum; //최종 값 리턴
}
public static void main(String[] args){
boolean str[] = new boolean[10001]; //false로 초기화 되어있음
for(int i=1; i<=10000; i++) { //0부터 10000까지
int result = self_number(i); //self_number 함수를 호출해 결과 값 구하기
if(result<=10000) { //결과 값이 10000이하면
str[result] = true; //그 해당 값 인덱스 배열에 true 대입
}
}
for(int i=1; i<=10000; i++) {
if(str[i]==false) { //해당 인덱스에 false가 있다면 생성자가 없는 숫자이다.
System.out.println(i);
}
}
}
}
접근 방법
1부터 10000까지
1 -> 1+1 =2 str[2] = true
2 -> 2+2 =4 str[4] = true
235 -> 235+2 +3+5=245 str[235] = true
이렇게 2, 4, 245는 해당 수를 생성자로 하는 생성자를 가지고 있는 수이다.
그러므로, 결과(sum)에 없는 수는 생성자를 가지고 있지 않는 수이다. 결과값의 해당 인덱스에 true를 넣어주면 생성자가 있는 수 -> 최종적으로 false가 있는 배열의 인덱스는 생성자가 없는 수이다. str[1] = false , str[3] = false
self_number 함수는 보면 들어온 수를 먼저 sum에 넣어준다
ex) 235가 들어오면 sum = 235
- 235(n)%10 = 5 (일의자리) sum = 235 + 5 =240
5라는 일의 자리수를 구한 후, 235/10 = 23 이라는 숫자를 얻어- 23(n)%10 = 3 (십의자리) sum = 240 + 3 =243
3 이라는 십의 자리수를 구한 후, 23/10 = 2 이라는 숫자를 얻어- 2(n)%10 = 2 (백의자리) sum = 243+ 2
2라는 백의 자리수를 구한 후, 2/10 = 0 이면 반복문을 벗어나 sum을 return한다.