관리 메뉴

LC Studio

백준 4673 셀프 넘버 JAVA 본문

Java/백준 알고리즘

백준 4673 셀프 넘버 JAVA

Leopard Cat 2022. 3. 15. 17:23

셀프 넘버는 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보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

 

함수를 활용하여 해결하는 문제이다.

어떻게 처리할 수 있을까 고민해보다, 아직 함수가 익숙하지도 않고 생각이 잘 나지않아 다른 블로그를 참고하여 풀었다.

주석을 보면 이해할 수 있을 것이다.

 

public class Main{
    //메인 함수
    public static void main(String[] args){
        
        boolean[] check = new boolean[10001];
        
        for(int i=0;i<10001;i++){ //1~10000의 수를 한번씩 호출
            int n = d(i); //d(int number)함수를 통해 sum값(Self Number)을 받아옴

            if(n<10001){ //1~10000범위 사이의 Slef Number을 check[] boolean 배열에 true로 담음
                check[n] = true;
            }
        }

        for(int i=0;i<10001;i++){
            if(!check[i]){  //1~10000 중 check 배열에 없으면 출력해줌 
            System.out.println(i);
            }
        }

        
    }

    //함수 선언
    public static int d(int number){
        int sum = number; //메인 함수에서 받아온 수를 sum에 저장 

        while(number != 0){ //number이 0이 될때까지...
            sum = sum + (number%10); //%10으로 1일자리수 구해서 기존의 sum에 더해줌
            number = number/10; //나눗셈으로 1일자리수 삭제
        }
        return sum;
    }
}

처음 생각할 땐 매우 복잡한 문제라고 생각했지만, 다른 블로그에서는 굉장히 깔끔하고 간단하게 풀어내었다.

내가 스스로 푼 대부분의 문제는 복잡하다.

처음부터 간결하게 풀 수 있다는 기대를 버려야 할 것 같다.

지속적으로 복습하며 코드를 더욱 간결하게 만들어야겠다.

반응형

'Java > 백준 알고리즘' 카테고리의 다른 글

백준 1157 단어공부 (Java)  (0) 2022.03.17
백준 1065 한수 (JAVA)  (0) 2022.03.16
백준 4344 평균은 넘겠지 (Java)  (0) 2022.03.15
백준 8958번 (JAVA)  (0) 2022.03.14
백준 3052 나머지(JAVA)  (0) 2022.03.11