공부하기/백준

[Java] 백준 풀기 4673 - 셀프 넘버

XEV 2023. 1. 22. 17:53

자바 백준 4673번

실버 5

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

 

 

 

 

 

문제 보기

분류: 수학, 구현, 브루트포스 알고리즘

 

 

 

 

 

문제 풀기

셀프 넘버인지 아닌지를 판단하기 위해 10_000 개의 배열의 Index 를 활용한다.

자기 자신과 각 자리의 합으로 이루어진 숫자는 셀프 넘버가 아니기때문에 배열에 1 로 표시를 해놓는다.

10_000 까지의 숫자를 모두 돌고 나서 배열에 1 이 아닌 0 이 되는 숫자의 index 를 모두 출력하여 답안을 제출한다.

 

 

 

 

 

코드 보기

import java.util.Arrays;

public class Main {
    
    public static void main (String[] args){
        
        int[] tenthousandArr = new int[11_000]; // 셀프 넘버인지 아닌지를 판단할 10_000 개 이상 배열을 넉넉하게 생성.
        
        int num = 0;
        while (num <= 10_000) { // 0 부터 10_000 까지 순차적으로 숫자를 대입.
            char[] chrNum = new char[String.valueOf(num).length()]; // 입력된 숫자를 char 타입으로 변경하기 위해 입력된 숫자의 자릿수 만큼 char 배열 생성.
            chrNum = Integer.toString(num).toCharArray(); // 생성된 char 배열에 순차적으로 넘어오는 num 을 int -> String -> char 로 변경하여 배열에 저장.
            
            // System.out.println(Arrays.toString(chrNum)); // TEST PRINT
            
            int sumNum = fnSumChar (chrNum); // 각 자리의 숫자들의 합을 구하기 위한 함수에 chrNum 배열 넘김.
            // System.out.println(sumNum); // TEST PRINT
            
            int isNotSelfNumber = num + sumNum; // 원래 숫자 num 과 각자리의 합 결과인 sumNum 을 더함. 이 숫자는 셀프 넘버가 아님.
            // System.out.println(selfNumber); // TEST PRINT
            
            tenthousandArr[isNotSelfNumber] = 1; //  초기 생성된 10_000 개 이상의 배열에서 해당하는 index 에 1 을 표시. 이 위치는 셀프 넘버가 아님.
            
            num += 1;
        }
        // System.out.println(Arrays.toString(tenthousandArr)); // TEST PRINT
        
        for (int i = 0; i < 10_000; i++) { // 모두 판단된 배열에서 지금까지 표시한 1 이 아닌 0 이면 그 index 출력.
            if (tenthousandArr[i] == 0) {
                System.out.println(i);
            }
            
        }
    
    }
    
    public static int fnSumChar (char[] chrNum){ // chrNum 배열을 입력 받아 배열 안의 모든 수를 더하여 int 로 return.
        
        int total_sum = 0;
        for (int n : chrNum) {
            total_sum += n - '0'; // char 타입의 데이터를 int 타입으로 변경.
        }
        return total_sum;
        
    }
    
}