셀프 넘버(4673)

함수 d를 정의하여 문제를 해결해 봅시다.

문제

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.

양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.

예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다.

생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97

10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력

입력은 없다.

출력

10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.

예제 입력

없음

예제 출력

1
3
5
7
9
20
31
42
53
64
 |
 |       <-- a lot more numbers
 |
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993
public class Main {
    public static void main(String[] args) {
        int n = 0;
        boolean nums[] = new boolean[10001];
        for(int i=1; i<=10000; ++i){
            int d = selfNum(i);
            if(d <= 10000){
                nums[d] = true;
            }
        }
        for(int i=1; i<nums.length; ++i){
            if(!nums[i]){
                System.out.println(i);
            }
        }
    }

    public static int selfNum(int num){
        int fir = (num/1000)%10;
        int sec = (num/100)%10;
        int thr = (num/10)%10;
        int four = (num/1)%10;
        return num+fir+sec+thr+four;
    }
}

셀프 넘버를 찾아야하기 때문제 먼저 함수를 만듬 -> selfNum

함수(selfNum)의 기능은 숫자의 생성자를 찾는 것 : 해당 숫자 + 일의자리수 + 십의자리수 + 백의자리수 + 천의자리수를 더해서 생성자를 리턴하는 함수

크기가 10001인 배열을 만들고

함수를 이용해서 생성자를 체크하고 배열에서 생성자의 자리에 true값을 넣어줌

마지막으로 배열을 돌면서 false인 값들을 찾아서 출력

두번째 시도

오랜만에 보는 문제인데 역시 실제로 숫자 넣어서 어떻게 계산해서 자리수를 가져올껀지 계산하고 실제로 돌려보니까 10000을 넘는경우가 있어서 if문으로 함수를 통해서 계산했을때 10000보다 낮은 경우에만 체크를 해주었다.

boolean 배열을 만들게 되면 기본적으로 default값은 false로 측정이되어있다..! 당연히 true인줄 알고 체크할때 false로 체크했었는데 그거바꾸니까 잘 나온다..!

public class Main {
    public static void main(String[] args) {
        boolean[] arr = new boolean[10001];

        for(int i=1; i<=10000; i++){
            if(fn(i) <= 10000)
                arr[fn(i)] = true;
        }
        for(int i=1; i<=10000; i++){
            if(!arr[i])
                System.out.println(i);
        }
    }
    
    public static int fn(int n){
        return n+n/1000+n/100%10+n/10%10+n%10;
    }
}

Last updated

Was this helpful?