본문 바로가기
알고리즘/백준

[백준/C,C++] 10610번: 30

by 이민훈 2021. 4. 20.

www.acmicpc.net/problem/10610

 

10610번: 30

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

www.acmicpc.net

풀이

30의 배수는 끝자리가 0으로 끝남과 동시에 3의 배수여야 합니다.

 

즉 입력된 수의 각 자릿수에 0이 하나라도 존재해야 하고,

 

각 자릿수를 모두 더한 합이 3의 배수여야 합니다.

 

 

두 조건을 충족한다면 입력된 수의 각 자릿수를 큰 숫자부터 출력해주면 됩니다.

 

#include<iostream>

using namespace std;

int main(void)
{
    int cnt[10] = { 0, };
    string s; cin >> s;
    int len = s.length();
    int sum = 0;

    for (int i = 0; i < len; i++) {
        cnt[s[i] - '0']++;
        sum += (s[i] - '0');
    }

    if (cnt[0] == 0 || sum % 3 != 0) cout << -1;
    else {
        for (int i = 9; i >= 0; i--) {
            for (int j = 0; j < cnt[i]; j++) {
                cout << i;
            }
        }
    }

    return 0;
}

반례

Input

302

Output

-1

 

Input

903

Output

930

 

Input

9876543210

Output

9876543210

 

Input

1231231231231230

Output

3333322222111110

댓글