왜 30을 존경하는지 모르는 미르코덕에 길거리에서 찾은 수를 가지고 30의 배수가 되는 가장 큰 수를 만들어야 한다.
리모콘부터 시작해서 세상에는 정말 독특한 친구가 많다
이 문제의 유의점은 N은 최대 10^5 개의 숫자로 구성이 되어있다. 인데
저걸 최대 값이 10000이 아닌 10만자리의 수로 봐야 한다.
10만자리의 수를 받을 수 있는 자료형은 문자열 말고는 없다.
30의 배수가 되려면 1의 자리가 무조건 0 이어야 한다. => 0이 없으면 만들 수 없다.
1의 자리를 제외하고 나머지의 값이 3의 배수가 되어야 한다 => 모든 자리의 합이 3의 배수면 30의 배수가 된다.
가장 큰 수를 만들어야 한다 => 두개의 조건이 만족되면 9부터 채워나간다.
그리디 알고리즘이 적용되는 부분은 가장 큰 수를 만들때 가장 큰 값이 앞에 들어간다.
이 부분인거 같다. 문제의 의도가 잘 이해가 안된다.
#include <iostream>
#include <string>
using namespace std;
const int MAX = 100000;
int main()
{
int digits[10] = {};
char res[MAX + 1] = { '-', '1', };
string input;
cin >> input;
for (int i = 0; i < input.length(); i++)
digits[input[i] - '0']++;
if (digits[0])
{
int isAble = 0;
for (int i = 1; i < 10; i++)
isAble += i * digits[i];
if (isAble % 3 == 0)
{
int pos = 9;
for (int i = 0; i < input.length(); i++)
{
while (digits[pos] == 0)
pos--;
res[i] = pos + '0';
digits[pos]--;
}
}
}
cout << res;
return 0;
}
2019-01-16 12:00:00에 Tistory에서 작성되었습니다.