문제 링크 : https://www.acmicpc.net/problem/2231
216
198
Bruteforcing 방식으로 풀이하는 문제이다.
Brute-Force : 완전탐색 알고리즘으로 볼 수 있다. 즉, 가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져온다. 이 알고리즘의 강력한 점은 예외 없이 100%의 확률로 정답만을 출력한다.
1부터 하나씩 증가하며 N의 생성자가 되는 값을 구한다. (생성자는 문제에서 설명한 것과 같다. e.g. 123 + 1 + 2 + 3 = 129 이때 129의 생성자는 123이 된다.) 가장 처음으로 발견된 생성자가 최소값이고, 생성자는 항상 N보다 작다는 것을 조건으로하는 반복문을 이용하였다. 모두 더하는 부분은 int -> String -> char[] 을 이용해 길이를 구하고 하나씩 더하는 방식으로 풀이하였다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
//분해합
public class p2231 {
public static void main(String[] args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int createNumber=0;
int sum =0;
//생성자는 N보다 무조건 작다.
while (N>createNumber){
sum = 0;
createNumber++;
String cn = Integer.toString(createNumber);
int len = cn.length();
char c[] = cn.toCharArray();
//생성자길이 만큼 반복 e.g.) 129 = 123 + 1 + 2 + 3 여기서 + 1 + 2 + 3
for(int i=0; i<len; i++){
sum += c[i]-'0';
}
//생성자 자체 숫자 더하기 e.g.) 129 = 123 + 1 + 2 + 3 여기서 + 123
sum += createNumber;
// 입력값과 같은지 확인
if(sum == N){
break;
}
}
if(sum==N){
// 생성자가 있는 경우
System.out.println(createNumber);
}
else{
// 생성자가 없는 경우
System.out.println(0);
}
}
}
숫자를 String-> char[] 식으로 저장해서 생성자 길이만큼 하나씩 더하는 방법을 사용했는데, 조금 더 단순한 방법을 찾고 싶다 10의 나머지를 이용하는 방법으로도 풀 수 있을 것 같다! ㅎ.. 다음에 풀어서 정리해봐야겠...!