Algorithm

백준[4673] - 셀프 넘버

빠쿤 2024. 1. 25. 20:19
  • 문제: https://www.acmicpc.net/problem/4673
  • 분류: 수학, 구현, 브루트포스
  • 난이도: S5
  • 소요시간: 10m
  • 자아성찰:
    • 문제를 보았을 때 시간복잡도는 O(n)으로, 브루트포스로 풀 수 있음을 알았다. (n <= 10000)
    • 문제에서 메서드 d()를 잘 설명해주고 있어서 구현은 어렵지 않았다.
    • 메모리를 아낄 수 있도록 굳이 int 배열이 아니라 boolean 배열로 처리했어도 될 것 같다. (T/F로 처리 가능)
 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net


public class B_4673 {

    static int[] arr = new int[10001];
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) {
    
        // d(i) 함수의 결과로 나온 값은 셀프 넘버가 아님 (i가 생성자임을 의미)
        for (int i = 0; i <= 10000; i++) {
            int d = d(i);
            if (d <= 10000) {
                arr[d(i)] = -1;
            }
        }
        for (int i = 0; i <= 10000; i++) {
            if (arr[i] != -1) {
                sb.append(i).append("\n");
            }
        }
        System.out.println(sb);
    }

    public static int d(int i) {
        int a = i / 1000;
        int b = (i % 1000) / 100;
        int c = (i % 100) / 10;
        int d = i % 10;
        return i + a + b + c + d;
    }
}