분해합
https://www.acmicpc.net/problem/2231
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 2 초 | 192 MB | 109250 | 50074 | 39400 | 45.235% |
문제
어떤 자연수 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을 출력한다.
예제 입력 1
216
예제 출력 1
198
예제 입력 A
113
예제 출력 A
97
예제 입력 B
84164
예제 출력 B
84139
예제 입력 C
978
예제 출력 C
957
예제 입력 D
1
예제 출력 D
0
출처
ICPC > Regionals > Asia Pacific > Korea > Asia Regional – Seoul 2005 B번
알고리즘 분류

통과된 코드
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string str = "";
int strToInt;
int tempInt, sum, result = 0;
string tempString;
int main()
{
cin >> str; // 문자열로 입력을 받아놓는다.
strToInt = stoi(str); // string => int
// 입력값의 범위가 (1 ~ 1,000,000)이므로
// M을 이루는 각 자리수의 합은 0이 될 수 없다.
// 각 자리수의 합이 1 ~ N의 자리수 * 9 까지 모두 확인
for (int i = 1; i <= str.length() * 9; i++) {
sum = 0;
tempInt = strToInt - i;
tempString = to_string(tempInt);
for (int j = 0; j < tempString.length(); j++) {
sum += tempString[j] - '0'; // 모든 자리의 합
}
if (sum == i) { result = tempInt; } // 같은지 비교
}
cout << result;
return 0;
}


![백준 11720번 (숫자의 합, C++) [BAEKJOON]](https://lycos7560.com/wp-content/uploads/2022/10/boj-og-1-2048x1070-1-1024x535.png)
![백준 1075번 (나누기, C++) [BAEKJOON]](https://lycos7560.com/wp-content/uploads/boj-og.png)