Level
Silver 4
Idea
내가 접근한 순서는 다음과 같다.
문제에서 조건이
1. 주어진 수로 30 배수를 만들 수 있으면 그 중 가장 큰 수를 출력하고
2. 안 되면 -1을 출력하라
였으므로
(1) 우선 30의 배수가 되기 위한 조건을 알아야했다. 30의 배수가 되려면 3의 배수여야하고 동시에 10의 배수여야한다. 3의 배수는 각 자리수의 합이 3의 배수여야한다. 예를 들어 213은 2+1+3=6 이므로 3의 배수가 맞다. 난 몰라서 배수 판정법을 검색해봤는데 간단한건 외워두는 것도 좋을 것 같다. 나만 모르나?
(2)10의 배수는 끝자리가 0이면 된다. 그러므로 0이 들어가있는지 확인만 하면 된다. 위 조건을 통과하는 수 중 가장 큰 수를 구해야하는데 (3)가장 큰 수를 구하는 방법은 단순하다. 내림차순 정렬하면 된다.
Key Point
배수 판정법을 알고 있어야 쉽게 풀 수 있다.
그리고 처음에 제출했을 때 >>출력초과<< 라는 오류가 떴다. 처음 보는 오류라서 뭐가 초과됐다는 건지... 해결하기가 어려웠다. 보통 출력 초과 오류라고 하면 한줄 출력되어야할게 여러줄로 나온다거나 출력 형식에 맞지 않는 경우라고 해서 출력 조건을 다시 살펴봤는데 맞게 잘했다. 혹시나 하고 다른 TC를 넣어봤고 한가지 조건을 빼먹었다는 걸 알아챘다. 3의 배수가 아닌 경우에도 -1을 출력해야하는데 이 부분을 넣지 않아서 출력초과가 떴던 것이다. 310을 넣으면 -1이 아니고 310이 나왔기 때문에. if문을 넣어서 수정해줬더니 통과됐다.
Code
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
string st;
int result = 0;
vector<int>v;
cin >> st;
for (int i = 0; i < st.size(); i++) {
v.push_back(st[i] - '0');
} // 벡터에 한자리씩 삽입
if (find(v.begin(), v.end(), 0) == v.end()) {
cout << -1 << endl;
} // 0이 존재하지 않으면 -1 출력
else {
for (auto a : v) {
result += a;
} // 모든 자리 수의 합
if (result % 3 == 0) {
sort(v.rbegin(), v.rend());
for (auto a : v) {
cout << a;
}
} // 3의 배수면 내림차순 정렬로 출력
else {
cout << -1 << endl;
} // 아니면 -1 출력
}
return 0;
}
'나도 공부한다 > 알고리즘' 카테고리의 다른 글
[백준] 배열돌리기4 (JAVA) (0) | 2023.08.20 |
---|---|
[백준] 1431. 시리얼 번호 (C++) (0) | 2023.05.11 |
[백준] 2910. 빈도정렬 (C++) (0) | 2023.05.10 |
[백준] 2002. 추월 (C++) (0) | 2023.05.10 |
[백준] 16165. 걸그룹 마스터 준석이 (0) | 2023.05.08 |