10610 30
10610 30 (c++)
문제
https://www.acmicpc.net/problem/10610
- 주어진 숫자들로 30의 배수 중 가장 큰 수를 만들어 출력해라.
- 만들 수 없다면 -1을 출력해라.
접근 방식
그리디
- 30의 배수 중 가장 큰 수를 만들라는 것은
- 3의 배수이고
- 10의 배수인 수
를 만들라는 것이다.
- 3의 배수인 수는 모든 자릿수의 합을 3으로 나눈 나머지가 0이어야 한다.
- 10의 배수는 마지막 1의 자리가 0이어야 한다.
- 위의 조건을 만족하지 못하면 -1을 출력
- 만족한다면 우선순위 큐에 넣어 큰수부터 뽑아서 문자열을 만들고, 그것을 출력
문제 풀이
#pragma GCC optimize("Ofast")
#include <iostream>
#include <string>
#include <queue>
using namespace std;
string str;
int sum = 0;
int zeroCnt = 0;
int main()
{
cin >> str;
for (int i = 0; i < str.length(); ++i)
{
if (str[i] == '0')
{
zeroCnt++;
}
else
{
sum += str[i] - '0';
}
}
if (zeroCnt == 0 || sum % 3 != 0) cout << "-1\n";
else
{
priority_queue<char> pq;
for (int i = 0; i < str.length(); ++i)
{
pq.push(str[i]);
}
string answer = "";
while (!pq.empty())
{
answer += pq.top(); pq.pop();
}
cout << answer << '\n';
}
return 0;
}
다시 생각해 볼 점
- 문제의 핵심은 30의 배수 중 가장 큰 수 (그리디)
- 문제의 세부 조건인 30의 배수를 3의 배수와 10의 배수로 나눠서 검사했다는 점
- 그리디를 위해 가장 큰수부터 뽑아내기 위해서 배열에 넣고 정렬하여 사용할 수도 있지만 우선순위 큐를 활용했다는 점