정의
어떤 자연수 N에 대해, 자기 자신과 각 자리수의 합을 더한 값
수학 개념
생성자(Generator)와 탐색 범위 줄이기
생성자란?
탐색 시작점을 줄이는 이유
알고리즘 개념
분해합 문제는 “범위가 줄어든 완전탐색”이다
풀이 단계
start = max(1, N - 9×digits(N))
x를 start부터 N까지 증가시키며 d(x)를 계산
d(x)==N이면 x가 최소 생성자이므로 즉시 종료
💡 시간복잡도는 대략 O(9×digits(N) × digits(N)) 입니다.
실제로는 “최대 수십만 ~ 수백만” 범위에서도 충분히 통과하는 경우가 많습니다.
구현
Java로 구현하였습니다.
import java.io.*;
public class DecompositionSum {
static int digitSum(int x) {
int sum = 0;
while (x > 0) {
sum += (x % 10);
x /= 10;
}
return sum;
}
static int digits(int n) {
// n은 자연수라고 가정 (문제 조건에 맞춰 조정)
return String.valueOf(n).length();
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine().trim());
int d = digits(N);
int start = Math.max(1, N - 9 * d);
int answer = 0; // 생성자가 없으면 0
for (int x = start; x <= N; x++) {
int value = x + digitSum(x); // d(x)
if (value == N) {
answer = x; // 최소 생성자
break;
}
}
System.out.println(answer);
}
}
예시
N = 256일 때, 왜 생성자는 245인가