coding_test/BAEKJOON

백준 10610번 C++ 풀이

CodeJin 2022. 3. 18. 22:29

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

 

10610번: 30

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

www.acmicpc.net

시간 제한 메모리 제한 solved.ac 티어
1초 256MB 실버 5

문제

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

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

입력

N을 입력받는다. N는 최대 10^5개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.


숫자를 재배치하여 가장 큰 30의 배수를 만들 수 있는지에 대한 문제. 최대 10^5자리의 숫자로 구성되어있기 때문에, 당연히 일반적인 정수로는 받을 수 없고, 문자열을 통해 해결해야 한다.

 

30의 배수는 어떻게 찾을 수 있을까? 우선 30은 3과 10의 곱이다. 그렇다면, 우리는 3의 배수의 특징과, 10의 배수의 특징의 교집합을 찾으면 된다. 10의 배수는, 1의 자리 숫자가 무조건 0이다. 3의 배수는 각 자릿수의 총합이 3의 배수이면 그 숫자는 3의 배수이다. 이를 동시에 만족해야 하기 때문에, 입력받은 숫자(문자열)에 0이 있어야 하며, 동시에 총합이 3의 배수여야 한다.

 

위 두 조건을 만족하는 문자열이라면, 가장 큰 30의 배수는 어떻게 만들까? 당연히 큰 숫자가 맨 처음부터 나오면 될 것이다.

 

#include <bits/stdc++.h>
using namespace std;

int sum_pv(string& str){
    int sum = 0;
    for(char& x : str) {
        sum += x - '0';
    }
    return sum;
}

int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    string num;
    int sum;

    cin >> num;
    sum = sum_pv(num);
    
    if(num.find('0') == string::npos) {
        cout << -1;
    }
    else if(sum % 3 != 0) {
        cout << -1;
    }
    else {
        sort(num.rbegin(), num.rend());
        cout << num;
    }
}