본문 바로가기

알고리즘/BOJ

10610번

10610번 - 30


N의 범위가 너무 커서 string을 통해 문자열로 입력을 받았다. 그리고 이 각 문자열을 int 형으로 변환해서 vector 에 담았다.


30=2 * 3 * 5 이기 때문에 30의 배수이기 위해서는 3의 배수이자, 2의 배수이자 , 5의 배수여야 한다.


따라서 나는 3의 배수이자 2*5=10 의 배수를 찾기로 하였다. (조건 2개)


10의 배수이기 위해서는 끝자리에 0이 하나만 있으면 된다. (조건 1개 해결)


3의 배수이기 위해서는 각 자리의 합이 3의 배수여야 한다.(조건 2개 해결) - 증명은 구글링



이 조건에 맞게 가장 큰 정답을 구하기 위해서, 구한 각 자리를 내림 차순으로 정렬할 필요가 있었다.( sort 후에 reverse 를 이용함)


그리고 check 에는 각 자리의 합을 넣어주었다. 그래서 if 문을 통해 조건 1,2를 모두 통과하면 그대로 출력하도록 하였다.


<정답 코드>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    vector<int> n;
    string N;
    int check = 0;
    cin >> N;
 
    for (int i = 0; i < N.size(); i++)
    {
        n.push_back(N[i] - '0');
        check += N[i] - '0';
    }
 
    sort(n.begin(), n.end());
    reverse(n.begin(), n.end());
 
    if (check % 3 == 0 && n[n.size() - 1== 0)
    {
        for (int i = 0; i < n.size(); i++)
        {
            cout << n[i];
        }
        cout << endl;
    }
    else
    {
        cout << "-1" << endl;
    }
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

1744번  (0) 2017.12.10
1783번  (0) 2017.12.10
2875번  (0) 2017.12.10
11047번  (0) 2017.12.10
9466번  (0) 2017.12.09