on my way

[GDSC Week1-2] 백준 10610번:: 30 (C++) 본문

algorithm/C++

[GDSC Week1-2] 백준 10610번:: 30 (C++)

wingbeat 2021. 10. 3. 22:46
반응형

 

 

* 생각한 아이디어 및 문제 풀이

 

입력받은 수에 0이 없으면 -1을 출력한다.

수를 정수로 입력받으면 각 값을 받고 벡터를 넣을 때 나머지나 몫을 구해야할 것 같아서 그냥 문자열로 받아야 된다고 생각했다.

출력값은 내림차순으로 정렬한다.

 

그러나 도저히 아이디어가 떠오르지 않아서 찾아보니,

30의 배수가 되는 조건은 반드시 끝자리가 0이고, 모든 자리의 수를 더하면 3배수라는 것을 알게 되었다.

 

 

* 코드

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main(int argc, char const *argv[]){
    ios::sync_with_stdio(false); 
    cin.tie(NULL); cout.tie(NULL);
    
    string N;
    long long sum=0;
    bool flag = false;
    vector<int> v;
    
    cin >> N;
    
    for(int i=0; i<N.length(); i++){
        int n = N[i]-'0';
        if (n == 0) flag = true;
        sum += n;
        v.push_back(n);
    }
    
    if (!flag || (sum % 3 != 0)) {
        cout << "-1";
    }
    else {
        sort(v.begin(), v.end(), greater<>());
        for(auto& i :v){
            cout << i;
        }
    }
    
}

 

 

* 문제 링크

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

 

10610번: 30

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

www.acmicpc.net

 

 

* 회고

 

다른 사람과의 코드와 비교를 하는 과정에서 string도 vector처럼 sort가 가능하다는 것을 알게 되었다.

그래서 string으로도 문제를 풀이해보았다.

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main(int argc, char const *argv[]){
    ios::sync_with_stdio(false); 
    cin.tie(NULL); cout.tie(NULL);
    
    string N;
    long long sum=0;
    bool flag = false;
    
    cin >> N;
    
    for(int i=0; i<N.length(); i++){
        int n = N[i]-'0';
        if (n == 0) flag = true;
        sum += n;
    }
    
    if (!flag || (sum % 3 != 0)) cout << "-1";
    else {
        sort(N.begin(), N.end(), greater<>());
        for(auto& i :N){
            cout << i;
        }
    }
}

string으로 바로 푸니 메모리와 시간이 더 짧게 잡혔다.

반응형