PS 공부

백준 1일차 : 백준 4673번 셀프 넘버 (java11)

Min00 2023. 2. 18. 15:10

오늘 풀어볼 두번째 문제는 백준 4673 셀프넘버입니다!

 

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

딱봐도.. 어려울 것 같더라고요 하지만 포기하지 않고 한번 시도해봤어요!

 

우선 크기 만의 배열을 만들어서

1부터 숫자를 돌려서 이 숫자로 만들어지는 숫자를 없애자! 이렇게 생각을 했어요

 

boolean배열을 모두 true로 채우고 만들어지는 숫자 값에는 false를 새로 채운뒤, 마지막에 true인 배열의 인덱스 값만 출력하도록 했습니다!

 

 

머리로는 되는데.. 이게 설명하려니 글로 쓰기도 힘들고 참 그렇네요

 

차차 시간이 지나면 나아지겠죠!!

 

 

작성 코드 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.io.*;
import java.util.Arrays;
public class B4673 {
    
    public static int d(int n) {
        // 숫자를 만드는 함수 
        int result=n;
        while(n>0) {
            result+=n%10;
            n/=10;
        }
        return result;
    }
    
    public static void self_number(boolean[] arr,int i) {
        //boolean배열을 이용해 만들어지는 숫자의 값을 false로 바꾸고 다시 d(n)을 재귀호출하는 함수 
        while(d(i)<10000){
            arr[d(i)]=false;
            i=d(i);
        }
    }
    
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        boolean[] selfornot=new boolean[10000];
        Arrays.fill(selfornot, true);
        int k=1;
        while(k<10002) {
            self_number(selfornot,k);
            k++;
        }
        
        for(int l=1;l<selfornot.length;l++) {
            if(selfornot[l]) {
                System.out.println(l);
            }
        }
        
    }
 
}
 
 
cs