본문 바로가기
Algorithm/BOJ

[BOJ]10610번: 30 (c++)

by HBGB 2020. 6. 26.

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

 

10610번: 30

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

www.acmicpc.net

 

 

방법 1 : 내림차순 정렬

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력
	string num;
	cin >> num;
	
	// 내림차순 정렬
	sort(num.begin(), num.end(), [](char A, char B) {
		return A > B;
		});

	// 각 자리숫자의 합 구하기
	int sum = 0;
	for (int i = 0; i < num.size(); ++i)
	{
		sum += num[i] - '0';
	}

	// 합이 3으로 나누어 떨어지지 않거나, 맨 뒷자리가 0이 아니면 실패
	if (sum % 3 != 0 || num.back() != '0')
	{
		cout << -1;
	}
	else
	{
		cout << num;
	}

	return 0;
}

 

 

방법 2: 들어온 숫자의 개수를 저장하여 역순으로 출력

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력 - 숫자가 들어온 횟수를 nums벡터에 카운팅
	vector<int> nums(10);
	char c;
	int sum = 0;
	while ((c = getchar()) != '\n')
	{
		++nums[c - '0'];
		sum += c - '0';
	}

	// 합이 3으로 나누어 떨어지지 않거나, 0이 하나도 없으면 실패
	if (sum % 3 != 0 || nums[0] == 0)
	{
		cout << -1;
	}
	else
	{
		// 큰 숫자부터 들어온 횟수만큼 출력
		int idx = 9;
		while (idx >= 0)
		{
			while (nums[idx]-- > 0)
			{
				cout << idx;
			}
			--idx;
		}
	}

	return 0;
}

 

 

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

 

N에 포함된 숫자 일부만 선택해도 될줄 알았는데

그게 아니라 N에 포함된 숫자 전체를 이용해야 하는 문제였다.

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]12919번: A와 B 2 (c++)  (0) 2020.06.26
[BOJ] 1783번: 병든 나이트 (c++)  (0) 2020.06.26
[BOJ]2875번: 대회 or 인턴 (c++)  (0) 2020.06.26
[BOJ]1744번: 수 묶기 (c++)  (0) 2020.06.26
[BOJ]1541번: 잃어버린 괄호 (c++)  (0) 2020.06.26

댓글