도토리 줍는 개발자 김지무

백준 4673 셀프넘버 JAVA - jimoo 본문

알고리즘공부

백준 4673 셀프넘버 JAVA - jimoo

지무 2021. 10. 18. 14:23
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

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다.

양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 

생성자가 없는 숫자를 셀프 넘버라고 한다. 즉, d(n)함수로 만들 수 없는 숫자가 셀프넘버이다.

 

방법

1. 셀프넘버인지 체크하는 0~10000 범위의 boolean 배열(배열명: check)을 선언한다. 

   선언하면 모든 배열의 값이 false 값을 가지게 된다.

   (주의: 배열크기를 10000으로 선언하면 0~9999까지 저장된다. 따라서 배열크기를 10001로 선언해야한다.)

 

2. d(1)= 1+1=2, d(2) = 2+2=4, d(3)=3+3=6, ... ,d(9999)=9999+9+9+9+9, d(10000)

    1~10000 까지 d(n)을 실행하면서 나온 결과값을 check 배열에 true로 저장한다.

 

3. check 배열을 1~10000까지 모두 접근하면서 false인 값을 가지는 인덱스만 출력한다.

 

d(n) funtion 설명

d(n) 함수는 매개변수로 들어온 n 과 n의 각 자리수를 더하는 함수입니다. 

d(1234) = 1234 + 1 + 2 + 3 + 4

아래의 코드로 설명을 하겠습니다.

 

함수가 실행 됐을 때, sum을 매개변수 num으로 초기화합니다.

그리고 while문으로 들어가게 됩니다. 처음 while 문에 들어왔을 때,

sum = sum+(num%10); <--  1234 + 4 가 적용됩니다!

num = num/10;  <-- 1234 / 10 = 123

 

두 번째 while 문에 들어왔을 때

sum = sum+(num%10); <--  (1234 + 4) + 3 가 적용됩니다!

num = num/10;  <-- 123 / 10 = 12

 

세 번째 while 문에 들어왔을 때 

sum = sum+(num%10); <--   (1234 + 4 + 3) + 2 가 적용됩니다!

num = num/10;  <-- 12 / 10 = 1

 

네 번째 while 문에 들어왔을 때

sum = sum+(num%10); <--   (1234 + 4 + 3 + 2) + 1 가 적용됩니다!

num = num/10;  <-- 1 / 10 = 0

 

다섯번째 while 문에 들어왔을 때는 num이 0이므로 조건을 만족하지 않아 while문이 종료되게 됩니다.

 

그러면 최종적으로 1234 + 4 + 3 + 2 + 1 이 저장된 sum이 return 됩니다.

    public static int d(int num){
        int sum = num;
        while (num!=0){
            sum = sum + (num%10);
            num = num/10;
        }
        return sum;
    }

전체 코드

public class Main {
    public static int d(int num){
        int sum = num;
        while (num!=0){
            sum = sum + (num%10);
            num = num/10;
        }
        return sum;
    }
    
    public static void main(String[] args){
    	// 1~10000사이의 셀프넘버를 구해야한다.
        // 인덱스는 0부터 시작하기 때문에 배열크기를 10001으로 지정해야한다. (0~10000 인덱스 생성)
        boolean[] check = new boolean[10001];
        
        // 셀프 넘버가
        for(int i=1;i<=10000;i++){
            int n = d(i);
            if (n<10001){
                check[n] = true;
            }
        }
        // 셀프 넘버 출력
        for (int i = 1; i<=10000; i++){
            if (!check[i]){
                System.out.println(i);
            }
        }
    }
}

 

어려운 문제는 아닌 것 같네요!

728x90
반응형
Comments