https://www.acmicpc.net/problem/2231
[ 문제 ]
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.
자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.
[ 입력 ]
첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
[ 출력 ]
첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.
[ 입출력 예시 ]
예제 입력 | 예제 출력 |
---|---|
216 | 198 |
자리수의 합의 최대는 9로 채워져있을 때이다.
1. 입력되는 수를 받을 변수(N)을 선언하여 값을 받아준다.
2. N에서 N의 자릿수 9를 하여 어느 수와 그 수의 자릿수를 더했을 때의 N이라는 값이 나올 수 있는지에 대한 값을 찾는다.
ex) N = 100 이라면 93 = 27 해서 63부터 100까지 중에서의 값들만 조건을 충족시킬 수 있다.
3. 가장 최솟값을 range라는 변수에 담아주었다. 이제 i = range부터 i<=N까지의 수들을 하나씩 다 확인해준다.
4. 각 자리수의 합은 placeSum이라는 메서드를 만들어 재귀함수를 사용하여 구해주었다.
매개변수로 값(num)을 받고, 이 값이 10을 넘어가면, num%10 으로 일의 자리 수에 그 다음 placeSum(num/10)을 하여 일의 자리를 제외한 그 다음 수로 계속 자릿수가 더해지게 한다.
5. 만약 이 자릿수 값이 N과 더했을 때 N과 같은 값을 가지면 num을 출력하고 종료하며, 값이 없다면, 0을 출력한다.
import java.util.Scanner;
public class Main {
public static int placeSum(int num) {
if(num < 10) {
return num;
}
return num%10 + placeSum(num/10);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int range = N - 9*(Integer.toString(N).length());
int sum = 0;
for(int i=range; i<=N; i++) {
sum = i + placeSum(i);
if(sum == N) {
System.out.println(i);
break;
}
else if(i==N) {
System.out.println(0);
}
}
}
}