본문 바로가기
코딩테스트/백준

[백준] 4673셀프넘버-Java

by GGShin 2022. 5. 11.

내 풀이

public class 셀프넘버 {

    public static void main(String[] args) {

        //전체 수
        int[] wholeNum = new int[10000];
        for(int i = 0; i < 10000; i++) {
            wholeNum[i] = (i + 1);
        }
        //d 수
        int[] dNum = new int[10000];
        for(int j = 0; j < 10000; j++) {
            dNum[j] = d(j);
        }

        //비교
        for(int a = 0; a < 10000; a++) {
            int noDNum = 0;
            int count = 0;
            for(int b = 0; b < 10000; b++) {
                if(wholeNum[a] == dNum[b]) {
                    count += 1;
                }
            }
            if(count == 0) {
                noDNum = wholeNum[a];
            }
            if(noDNum != 0) {
                System.out.println(noDNum);
            }
        }
    }

    //d(n) method
    public static int d(int number) {
        int result = 0;
        String stringNum = number + "";
        for(int i = 0; i < stringNum.length(); i++) {
            result += Character.getNumericValue(stringNum.charAt(i));
        }
        return (result + number);
    }
}

 

회고

d(n) 숫자를 만드는 method를 신박하게 만들었음..😛

숫자 자리수와 관련된 문제는 / 연산자와 % 연산자 조합으로 풀면 훨씬 쉽게 풀 수 있음!

 

 

다른 풀이

백준에 제출된 다른 사람들의 풀이를 토대로 나에게 맞춰 변경해보았음.

public class Main {
    public static void main(String[] args) {
    	//문제에서는 10000이하만 보면 되지만, 다른 수일때도 쉽게 확인해보기 위해 변수 생성
        int totalNum = 10000;
		
        //true, false 알려주는 flag를 모아둔 array 제작
        boolean[] flags = new boolean[totalNum];
        
        //index와 숫자를 연결하여 생각하는 방법
        for(int i = 0; i < flags.length; i++) {
            int dNum = d(i + 1);
            if(dNum <= totalNum) {
                flags[dNum - 1] = true;
            }
        }

        for(int j = 0; j < flags.length; j++) {
            if(!flags[j]) {
                System.out.println((j + 1));
            }
        }
    }
    
    //d(n) 찾기
    public static int d(int num) {
        int sum = num;
        while(num > 0) {
            sum += (num % 10);
            num /= 10;
        }
        return sum;
    }
}

 

시사점

1) true와 false 상태를 알려주는 flag들을 array에 담아 사용할 수 있음

2) 배열로 연속된 숫자들을 다룰 때(?) 또는 배열과 연속된 숫자가 같이 다뤄지는 문제에서는 배열의 index number를 숫자와 연결지어 사용하면 좋다. (index = 0 은 숫자 1, index = 1 은 숫자 2 ,,,이런 식으로! for loop 돌릴 때 유용할 듯.)

 

여러 시사점을 얻은 문제👏👏👏

 

 

문제 링크: 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

 

반응형

'코딩테스트 > 백준' 카테고리의 다른 글

[Swift] 1712 손익분기점  (0) 2022.02.09
2438-별 찍기 - 1  (0) 2022.01.26
11021-A+B-7  (0) 2022.01.26
2739-구구단  (0) 2022.01.26