본문 바로가기

백준/실버

[백준 10610번] 30 (C++)

문제링크 : https://www.acmicpc.net/problem/10610

 

10610번: 30

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>

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

    string S;
    int sum = 0;
    cin >> S;
    sort(S.begin(), S.end(), greater<>());
    if (S[S.length()-1] != '0') cout << -1; //마지막 수가 0이 아니라면
    else 
    {
        for(int i=0; i<S.size(); i++)
        {
            sum+=S[i]-'0';  //숫자로 더해줌
        }
        if(sum%3==0) cout << S;  //30의 배수이므로 3으로 떨어진다면
        else cout << -1;
    }

    return 0;
}

입력받은 숫자들을 활용하여 가장 큰 수이자, 30의 배수를 찾는 문제이다.

문자 문자열로 입력받고, 이를 가장 큰 숫자대로 정렬하려 수를 가장 크게 만들어준다.

이때 마지막 수가 0이 아니라면, 30의 배수가 아니기에 -1을 출력한다.

 

정렬한 문자열을 순서대로 숫자로 변환하여 더해주고, 더해준 숫자가 3으로 나누어 떨어지면 문자열을 출력하고 아니라면 -1을 출력한다.

여기서 30으로 나누어 떨어지는 것이 아니라, 3으로 떨어지는 것을 카운트하는 이유는, 앞서서 수의 맨마지막이 0인지 아닌지를 체크해줬기 때문이다.