profile image

L o a d i n g . . .

https://www.acmicpc.net/problem/4673


public class Main {
    public static int d(int number) {
        int sum = number;

        /*
            1234가 들어온다면
            
            첫 번째 while문
            sum = sum + (1234 % 10) -> 1234 + 4
            number = 123
          
            두 번째 while문
            sum = sum + (1234 + 4) + 3
            number = 12
            
            ...
         */
        while (number != 0) {
            sum = sum + (number % 10);
            number /= 10;
        }
        return sum;
    }

    public static void main(String[] args) {
        /*
           1 ~ 10000 사이의 셀프 넘버를 구해야 함
           인덱스는 0부터 시작하므로 배열 크기를 10001 로 해야만 0~10000 범위 지정 해야 함
         */
        boolean[] check = new boolean[10001];

        // 셀프 넘버가 아님
        for (int notSelfNum = 1; notSelfNum <= 10000; notSelfNum++) {
            int n = d(notSelfNum);
            if (n < 10001) {
                check[n] = true;
            }
        }

        // 셀프 넘버 출력
        for (int selfNum = 1; selfNum <= 10000; selfNum++) {
            if (!check[selfNum]) {
                System.out.println(selfNum);
            }
        }
    }
}

    public static int d(int number) {
        int sum = number;

        while (number != 0) {
            sum = sum + (number % 10);
            number /= 10;
        }
        return sum;
    }

전달인자로 1234 라는 값이 들어온다면 

 

첫 번째 while문

sum = sum + (1234 % 10) -> 1234 + 4

number / 10 = 1234 / 10 -> 123

 

두 번째 while문

sum = sum + (123 % 10) -> (1234 + 4) + 3

123 / 10 = 12

 

세 번째 while문

sum = sum + (12 % 10) -> (1234 + 4 + 3) + 2

12 / 10 = 1

 

네 번째 while문

sum = sum + (1 % 10) -> (1234 + 4 + 3 + 2) + 1

1 / 10 = 0

 

다섯 번째 while문은 number가 0이므로 while문 종료 됩니다.

sum에는 1234 + 4 + 3 + 2 + 1 이 합쳐진 1244가 반환 됩니다.


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

        for (int notSelfNum = 1; notSelfNum <= 10000; notSelfNum++) {
            int n = d(notSelfNum);
            if (n < 10001) {
                check[n] = true;
            }
        }

        for (int selfNum = 1; selfNum <= 10000; selfNum++) {
            if (!check[selfNum]) {
                System.out.println(selfNum);
            }
        }
    }
boolean[] check = new boolean[10001]; 1. boolean 타입으로 배열을 선언하면 디폴트 초기화 값은 false 2. 배열 크기를 10000으로 선언하면 0~9999 선언 됨 3. d(1) = 1 + 2, d(2) = 2 + 2, d(3) = 3 + 3...

모든 값을 다 돌고나면 두 번째 for문을 거치게 되는데, 만약 d(n) 함수로 만들 수 없는 숫자가 있다면 그 숫자가 셀프 넘버이므로 true 값이 저장되지 않아서 false인 상태일 것입니다.

if (!check[selfNum]) 를 거치게 되는데, true이면 false로 되어서 값을 출력하지 않게 됩니다. false이면 !를 만나 true가 되므로 값을 출력하게 됩니다.

참고

1. https://jimoo-vision.tistory.com/23

복사했습니다!