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 |
반응형