algorithm/baekjoon

[BOJ] 4673 셀프 넘버 (Java)

올빼밋. 2022. 6. 28. 21:59
728x90

# 출처 : https://www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

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

www.acmicpc.net


# 문제

주어진 수의 범위에 해당하는 셀프넘버를 출력하는 프로그램


# 풀이

d(n) = n + n의 각 자리수

n, d(n), d(d(n)), d(d(d(n))), ... 과 같이 무한 수열을 만들 수 있다.

n을 d(n)의 생성자라고 한다면, d(d(n))의 생성자는 d(n)이 된다는 것을 알 수 있다.

더보기

n=33

d(n)=33+3+3=39

d(d(n))=39+3+9=51

...

39의 생성자는 33, 51의 생성자는 39, ....

 

여기서 셀프 넘버란 생성자가 없는 숫자를 의미한다.


# 코드

public class Main {
    static final int NUM = 10001;
    static final int TEN = 10;

    public static void main(String[] args) {
        boolean[] numbers = new boolean[NUM]; // false로 자동으로 초기화
        for(int i=1; i<NUM; i++){
            int num = divice(i);
            if(num>NUM-1) continue;
            numbers[num] = true;
        }

        for(int i=1; i<NUM; i++){
            if(numbers[i]) continue; // true라면 셀프넘버
            System.out.println(i);
        }
    }

    public static int divice(int num) {
        int sum = num;
        while(num >= TEN){
            sum += num % TEN;
            num /= TEN;
        }
        return sum+num;
    }
 }
728x90