https://www.acmicpc.net/problem/10610
이 문제를 보고 간단히 생각하여 완전탐색으로 교환하여 풀었으나, 시간초과가 발생하였다. (10^5 * 10^5으로 당연히 시간초과^^)
그래서 다른 접근법을 생각해봤다. 30, 60, 120, 150, 180..
30의 배수라면
1. 마지막 수에 0이 존재해야만 한다.
2. 30의 배수라면 3의배수가 되어야만하고, 3의배수는 각자릿수의 합이 3의 배수로 나누어 떨어지면 30의 배수가 된다.
즉, 이 두가지 법칙만 적용된다면 30의 배수다. (이떄 숫자의 순서는 상관없기 떄문에 큰 순서대로 정렬해서 출력하면 된다.)
#include<iostream>
using namespace std;
#include<string>
#include<algorithm>
string s;
int Size = 0, ans = 0;
void thirty_test()
{
char test = 0;
int sum = 0;
Size = s.size();
for (int i = 0; i < Size; i++)
{
test = s[i];
sum += (int)(test-'0');
}
ans = sum;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
cin >> s;
thirty_test();
sort(s.begin(), s.end());
if (s[0] == '0' && ans % 3 == 0)
{
reverse(s.begin(), s.end());
cout << s << "\n";
}
else
{
cout << "-1";
}
return 0;
}
'백준_문제풀이' 카테고리의 다른 글
[백준]: 1541번: 잃어버린 괄호 / String (0) | 2018.10.06 |
---|---|
[백준]: 2875번: 대회 or 인턴 / 탐욕적 기법(Greedy Algorithm) (0) | 2018.10.04 |
[백준]: 5557번: 1학년 / DP(동적프로그래밍) (0) | 2018.09.27 |
[백준]: 2841번: 외계인의 기타연주 / Stack & pair (0) | 2018.09.26 |
[백준]: 1918번: 후위표기식 / Stack (0) | 2018.09.23 |