본문 바로가기
백준

[백준] 4673번 : 셀프 넘버 – JAVA [자바]

by Hongwoo 2022. 7. 8.
반응형

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

 


  • 문제

 


  • 문제 풀이

백준 4673번 셀프 넘버는 실버 5 난이도의 수학, 구현 및 브루트 포스 문제이다. 이 문제에서는 함수 d(n)이 있다. d(n)은 n과 n의 각 자릿수를 더하는 함수이다. 그리고 n을 d(n)의 생성자라고 한다. 그리고 생성자가 없는 수를 셀프 넘버라고 한다. 이 문제에서는 10000보다 작거나 같은 셀프 넘버들을 전부 출력하면 된다.

 

이 문제를 풀 때 일단 함수 d를 먼저 구현했다. 이 함수는 n과 n의 각 자릿수를 더하는 함수이니까 우선 int형 변수 sum = n으로 선언했다. 그리고 n을 10씩 나누면서 이 나머지들을 sum에 더해주었다. 이러면 sum은 d(n) 값이 된다.

 

이제 함수 d(n)이 완성되었으니 메인 메서드만 작성해주면 된다. 우선 사이즈가 10001인 boolean형 배열 arr을 선언했다. 이 배열은 한 자연수가 생성자가 있는지 없는지를 확인해주는 배열이다. 만약에 생성자가 있으면 true로 설정되고, 생성자가 없으면 false로 남는다. 

 

그리고 for-loop을 int i = 1부터 i = 10000까지 돌린다. 1부터 10000까지 모두 함수 d(n)을 적용하고 배열 arr [d(i)]를 모두 true로 바꿔주는 것이다. 이 이유는 1부터 10000까지 for-loop을 돌렸을 때 생성자가 있던 수였던 것이다. 그리고 마지막으로 배열을 iterate 하면서 false인 값들을 전부 출력하면 된다. 이 수들은 생성자가 없는, 즉 셀프 넘버이기 때문이다.

 

자세한 코드는 밑에 있다.

 


  • 코드

 

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        boolean[] arr = new boolean[10001];
        for (int i = 1; i <= 10000; i++) {
            int num = d(i);
            arr[num] = true;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= 10000; i++) {
            if (!arr[i]) sb.append(i + "\n");
        }
        System.out.print(sb);
    }

    static int d(int n) { //셀프 넘버 함수
        int sum = n;
        while (n != 0) {
            sum += n % 10;
            n /= 10;
        }
        if (sum <= 10000) return sum;
        return 0;
    }
}

 

 

반응형

댓글