대엽님 블로그에서 퀴즈를 발견하고 원문을 보고 풀었는데 원문에는 파이썬 코드인지 모르는 문법이라 그런가 눈에 잘 안들어오네요. 대엽님이 푼 코드는 자바여서 역시 눈에 잘 들어오더군요. 문제를 다르게 풀 수 있을 것 같아서 코딩을 해봤습니다.

저는 1~4999까지 배열을 만들고 Generated 숫자가 될 수 있는 것들[footnote]다른 말로 generator를 가지고 있는 수[/footnote]을 지워나갔습니다.[footnote]해당 index안에 들어있는 수를 0으로 만들었습니다.[/footnote] 지우고 남는 숫자들이 Self Number들이기 때문에 나중에 배열에 들어있는 수를 쫙 더해주면 됩니다.

[#M_ more.. | less.. | public class SumOfSelfNumber {
    public static void main(String[] args) {
        new SumOfSelfNumber().start();
    }

    private void start() {
        int[] numbers = makeArray();
        checkSelfNumber(numbers);
        System.out.println(addAllSelfNumber(numbers));
    }

    private int[] makeArray() {
        int[] numbers = new int[4999];
        for (int i = 1; i < 5000; i++) {
            numbers[i-1] = i;
        }

        return numbers;
    }

    private void checkSelfNumber(int[] numbers) {
        for (int i = 0 ; i < numbers.length ; i++) {
            int generatedNumber = 0;
                generatedNumber = generate(i+1);
            if (generatedNumber != 0 && generatedNumber < 5000) {
                numbers[generatedNumber – 1] = 0;
            }
        }
    }

    private int generate(int number) {
        char[] chars = new String(number+””).toCharArray();
        int[] ints = new int[chars.length + 1];
        ints[0] = number;
        for (int j = 1; j < ints.length; j++) {
            ints[j] = (int)chars[j-1] – 48;
        }

        int generatedNumber = 0;
        for (int i = 0; i < ints.length; i++) {
            generatedNumber += ints[i];
        }

        return generatedNumber;
    }

    private long addAllSelfNumber(int[] numbers) {
        long sum = 0;
        for(int i : numbers)
            sum += i;
        return sum;
    }
}_M#]
코딩할 때 불편한 점은 int -> char -> int 이 과정에서 숫자가 변질 되는데 이것좀 어떻게 편하게 바꿀 수 있는 방법이 없을지 궁금하네요.

대엽님 코드를 보니 (int)c – (int)‘0’ 이런 방법으로  char 안에 들어간 int값을 그대로 살려냈는데 저도 마찬가지로 (int)chars[j-1] – 48 이런식으로 int값을 살려냈습니다. 좋은 방법 아시는 분~