💻 Algorithm/Bruteforcing(브루트포스)

[JAVA] 백준 4673 - 셀프 넘버

dlalwl_jpg 2024. 1. 16. 15:19

 

실버 V

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이다.

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


📤 입력

입력은 없다.


📥 출력

10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.


💡 접근방법

먼저 각 자리 숫자를 합하기 위해 숫자를 String으로 변환하고, charAt을 이용해 하나씩 자른 다음, 생성자를 더해 arr에 추가해주었다. 예를 들어, 33이면 33을 string으로 변환하고, charAt을 이용해 3, 3으로 자른다. 그럼 sum에 3 + 3인 6이 되고, arr에 넣어줄 때 sum인 6에 자기 자신인 생성자 33을 더한 39가 arr에 들어가게 된다.그렇다면 arr배열에는 생성자가 있는 숫자들이 들어가게 된다.그 다음, 1부터 10000까지 반복문을 통해 arr에 숫자가 있는지 확인한다. 숫자가 있다면 생성자가 있는 숫자라는 뜻이므로 셀프 넘버가 아니라는 말이다. 따라서 셀프 넘버가 아니면 check를 true로 변환하고, check의 true, false값에 따라 true면 continue, false면 셀프 넘버를 출력하였다.


💻 코드

package 브루토포스;

import java.io.IOException;
import java.util.ArrayList;

public class SLIVER5_BJ4673 {
    /*
        https://www.acmicpc.net/problem/4673
        셀프 넘버
     */
    public static void main(String[] args)throws IOException{

        ArrayList<Integer> arr = new ArrayList<>();

        for(int i = 1; i <= 10000; i++){
            //숫자를 문자열로 변환
            String num = String.valueOf(i);
            int sum = 0;

            //각 자리수 구하기
            for(int j = 0; j < num.length(); j++){
                //문자열을 문자로 하나씩 자르기
                char charNum = num.charAt(j);
                //자른 문자를 문자열로 변환하여 숫자로 다시 바꾸기
                int intNum = Integer.parseInt(String.valueOf(charNum));

                //각 자리 수의 합 구하기
                sum += intNum;
            }
            //생성자와 각 자리 수의 합을 arr에 넣기
            arr.add(sum + i);

        }

        for(int i = 1; i <= 10000; i++){
            boolean check = false;

            for(int j = 0; j < 10000; j++) {
                //arr에 있는 숫자는 셀프 넘버가 아니므로 
                if (arr.get(j) == i)
                    check = true;
            }

            //셀프 넘버가 아닌 경우 다시 반복문 시작, 셀프 넘버인 경우에만 출력
            if(check)
                continue;
            else
                System.out.println(i);
        }
    }
}