[백준/BOJ] 백준 10610번 : 30

2020. 6. 14. 02:47알고리즘 문제풀이

https://www.acmicpc.net/problem/10610

 

10610번: 30

문제 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶�

www.acmicpc.net

구하려는 수가 30의 배수라는 것에 초점을 두어야 한다.

30의 배수이려면, 일의 자리 수가 0이어야 하고, 각 자릿수의 합이 3의 배수여야 한다.

가장 큰 30의 배수는 이 조건을 만족하는 가장 큰 수이다.

 

코드

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	string input;
	int sum = 0;

	cin >> input;

	//입력 받은 수를 오름차순으로 정렬뒤 뒤집어서 내림차순으로 정렬한다.
	sort(input.begin(), input.end());
	reverse(input.begin(), input.end());

	//만약 끝에 '0'이 아니라면 '0'이 존재하지 않다는 의미이므로
	//30의 배수로 만들 수 없다 그러므로 -1 출력
	if (input[input.size() - 1] != '0')
		cout << -1;

	else
	{
		//각 자릿수의 합을 구한다
		for (int i = 0; i < input.size(); i++)
			sum += stoi(input.substr(i, 1));

		//각 자릿수의 합이 3의 배수가 아니라면 30의 배수가 될 수 없으므로
		//-1을 출력
		if (sum % 3 != 0)
			cout << -1;

		//내림차순으로 정렬한 값을 출력한다
		else
			cout << input;
	}
	return 0;
}