teddy8 Full Stack Software Engineer

[BaekJoon][Greedy] 10610. 30

2019-06-29
teddy8

문제

URL : https://www.acmicpc.net/problem/tag/%EA%B7%B8%EB%A6%AC%EB%94%94%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98


소스코드

/* 문제 : [10610] 30
[input]
(case 1) 30
(case 2) 102
(case 3) 2931
[output]
(case 1) 30
(case 2) 210
(case 3) -1
[설명]
어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 
미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 
30의 배수가 되는 가장 큰 수를 만들고 싶어한다.
미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.
N을 입력받는데 N는 최대 10^5개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.
미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 
그 수가 존재하지 않는다면, -1을 출력

0이 있는지 확인해야 하며,
0을 제외한 나머지 숫자의 합이 3의 배수인지 확인해야 한다
*/
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
	vector<int> num(10, 0);
	string n;	// // 미르코가 발견한 양수 N
	int sum = 0;

	cin >> n;

	for (int i = 0; i < n.length(); i++) {
		if (!((i == 0) && (n[i] == '0'))) {
			num[n[i] - '0']++;
			sum += n[i] - '0';
		}

		if (!n[i + 1]) 
			break;
	}

	//// 발견한 숫자 중 0을 제외한 숫자가 3의 배수가 아니거나 
	//// 0이 없으면 30의 배수가 아니므로 -1 출력
	if ((sum % 3 != 0) || (num[0] == 0)) {
		cout << "-1";
		return 0;
	}

	for (int i = 9; i >= 0; i--) {
		for (int k = 0; k < num[i]; k++) {
			cout << i;
		}
	}

	return 0;
}


Comments

Content