-
[BOJ-2231] 분해합 본문
불필요한 코드를 생성해서 당연히 시간초과 + 오답이 나왔다.
개인적으로 가장 싫어하고 어려워하는 유형의 문제이다. 차라리 조합으로 문제를 풀면 접근이라도 쉬울텐데.
여기서 배운 점은 1000000번 루프를 돌려봐야 1초안에 끝난다는 것!
기본적인 로직은
i 가 루프를 돌면서 자릿수만큼 더해주는데 이 값을 저장한 변수가 Input 값과 같으면(처음 같을 때가 당연히 최소값!) 출력,
i가 1000000을 넘어가면 당연히 못찾은 경우로 간주!
코드:
#include<iostream>
#include<vector>
using namespace std;
int N;
//int fun(int n){
// vector<int> vec;
// int tmp = n;
// while (tmp > 0){
// int get = tmp % 10;
// vec.push_back(get);
// tmp /= 10;
// }
// for (int i = 0; i < vec.size(); i++){
// n += vec[i];
// }
// return n;
//}
int main(){
cin >> N;
for (int i = 1; i <= 1000000; i++){
int number = i;
int tc = i;
while (number > 0){
int ret = number % 10;
tc += ret;
number /= 10;
}
if (tc == N){
cout << i;
break;
}
if (i + 1 > 1000000){
cout << 0;
}
}
/*int tmp = N;
bool flg = false;
int Min = 213456789;
int a = 0;
vector<int> vec;
while (tmp > 0){
int get = tmp % 10;
vec.push_back(get);
tmp /= 10;
a++;
}
tmp = N;
for (int i = 0; i < vec.size(); i++){
tmp -= vec[i];
}
int start = 1;
for (int k = 1; k < a; k++){
start *= 10;
}
for (int i = start; i <= tmp; i++){
if (fun(i) == N){
if (Min > i){
Min = i;
}
flg = true;
}
}
if (flg){
cout << Min;
}
else{
cout << 0;
}*/
return 0;
}