분해합
05 July 2019
문제 : https://www.acmicpc.net/problem/2231
이번은 모든 경우를 시도하여 N의 생성자를 구하는 문제를 풀어보도록 하겠습니다.
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String numStr = sc.next();
int num = Integer.parseInt(numStr);
int start = num - 9 * numStr.length();
if (start < 0) {
start = 0;
}
int ret = getRet(num, start);
System.out.println(ret);
}
private static int getRet(int num, int start) {
for (int i = start; i < num; i++) {
String val = String.valueOf(i);
int sum = i;
for (int k = 0; k < val.length(); k++) {
sum += Integer.parseInt(String.valueOf(val.charAt(k)));
}
if (sum == num) {
return i;
}
}
return 0;
}
}
이번은 모든 수를 대입하는 방식인 브루트포스를 이용해 문제를 풀어보도록 하겠습니다.분해합이란 본인의 수와 각자리의 수를 모두 합쳤을 때, 나오는 수로 정의되어 있습니다. (256(=245+2+4+5))
가장 간단한 풀이는 0부터 시작해서 targetNum까지 모든 수를 체크해보면 되지만 시간을 줄이기 위해서,각자리수 *9 만큼부터 시작하도록 합니다.
각자리의 최대 값은 9이고 각자리수만큼 더할 수 있으므로 분해합은 해당값보다 작을 수는 없습니다.
하지만 여기서 해당 값이 0보다 작아지는 경우가 있으므로 해당 경우에는 start를 0으로 설정해주도록 합니다.