[ Algorithm ] 백준 4673번 : 셀프 넘버 - [JAVA]

Minsu Lee·2023년 2월 14일
0

baekjoon

목록 보기
4/16
post-thumbnail
post-custom-banner

🎆백준 4673번 셀프 넘버🎆


📌문제

🔍문제 설명

문제 링크: https://www.acmicpc.net/problem/4673

🔍예제 입력

입력 없음

🔍예제 출력

1
3
5
7
9
20
31
42
53
64
|
| <-- a lot more numbers
|
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993


📌풀이

🔍풀이 설명

구현능력과 Brutforcing을 이용하는 문제이다.

Brute-Force : 완전탐색 알고리즘으로 볼 수 있다. 즉, 가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져온다. 이 알고리즘의 강력한 점은 예외 없이 100%의 확률로 정답만을 출력한다.

입력이 없고 주어진 범위의 셀프 넘버를 구하는 문제였다. 10001 크기의 배열을 생성하고 1부터 10000까지 수를 모두 돌려 셀프 넘버가 아닌 수는 배열에서 값에 차이를 두었다. 셀프 넘버가 아닌 수를 구하는 방법은 숫자 하나하나를 while 반복문을 통해 10으로 나눴을 때 나머지와 몫을 이용했다.

while (n != 0){ //n이 0이 아닐때까지 반복
            noself = noself + (n % 10); // 첫 째 자리수
            n = n/10;	// 10을 나누어 첫 째 자리를 없앤다
        }

출력에서 StringBuilder를 이용했는데 System.out.println()보다 빠른 출력을 위해서였다.

🔍코드


//셀프 넘버
public class p4673 {
    static int []self_number;
    static int brute_force (int n){
        int noself = n;

        while (n != 0){ //n이 0이 아닐때까지 반복
            noself = noself + (n % 10); // 첫 째 자리수
            n = n/10;	// 10을 나누어 첫 째 자리를 없앤다
        }

        return noself;
    }
    public static void main (String[] args){
        StringBuilder sb = new StringBuilder();
        self_number = new int [10001];

        for(int i=1; i<self_number.length; i++){
            int number = brute_force(i);
            if(number<10001) { //10000보다 작거나 같은 수만 필요
                self_number[number] = 1;
            }
        }

        for(int i=1; i<self_number.length; i++){
            if(self_number[i] == 0){
                sb.append(i).append("\n");
            }
        }

        System.out.print(sb);
    }
}

👋마무리👋

10으로 나눴을 때 나머지와 몫을 이용하는 것에서 의외로 헷갈렸다.. 나는 왜이렇게 머리가 안돌아갈까..? ㅠㅠ 풀다보면 늘겠징? 잊지말고 다음번에는 조금 더 빨리 풀 수 있도록!

profile
빙글빙글
post-custom-banner

0개의 댓글