C++
[C++] 백준 1431번: 시리얼 번호, sort에서 더 깊게 파고든 compare
도비(Doby)
2021. 9. 28. 16:28
이번 문제는 sort함수를 이용하며 compare에 더 깊게 파고들었다.
sort 할 때 compare 함수를 다음 코드로 짜서 컴파일했지만 계속 어디서 나는지도 모를 오류 Invalid Comparator가 발생한다. (Comparator라서 비교 함수 쪽에 문제가 있구나는 인식할 수 있었다.)
bool cmp(string a, string b) {
if (a.size() < b.size()) {
return a < b;
}
else {
int sumA = 0;
int sumB = 0;
for (int i = 0; i < a.size(); i++) {
if (a[i] < 10 && a[i] >= 0) {
sumA += a[i];
}
if (b[i] < 10 && b[i] >= 0) {
sumB += b[i];
}
}
if (sumA < sumB) {
return a < b;
}
else {
int cnt = 0;
while (1) {
if (cnt == a.size()) {
break;
}
if (a[cnt] < b[cnt]) {
return a < b;
}
cnt++;
}
}
}
}
계속 하나씩 수정해나가면서 풀어냈긴 했지만 해답은 찾지 못했다.
정답 cmp함수
bool cmp(string a, string b) {
if (a.size() != b.size()) {
// 첫번째 비교 조건
return a.size() < b.size();
}
else {
int sumA = 0;
int sumB = 0;
for (int i = 0; i < a.size(); i++) {//a와 b의 크기가 같을 때이므로 a사이즈를 가지고 해도 됨\
// 숫자의 아스키코드는 숫자 그 자체로 착각하고 있었다.
if (a[i] <= 57 && a[i] >= 48) {
sumA += a[i] - '0';
}
if (b[i] <= 57 && b[i] >= 48) {
sumB += b[i] - '0';
}
}
if (sumA != sumB) {
// 2번째 비교 조건
return sumA < sumB;
}
else {
// 주석 처리 해둔 3번째 조건이 필요 없는 이유
// 이미 크기가 같음
// 아스키 코드에서도 숫자가 영어보다 더 작기 때문에 바로 a < b로 리턴해도 된다.
return a < b;
}
/*
int cnt = 0;
while (1) {
if (cnt == a.size()) {
break;
}
if (a[cnt] != b[cnt]) {
//3번째 비교 조건
return a[cnt] < b[cnt];
}
cnt++;
}
*/
}
}
그래도 이걸 고치면 되겠다 라고 생각이 들어서 정리를 했던 건
1. if의 조건이 크고 작음을 나타내면 안 된다 ('!=' 이 연산자로 다른 지만 파악해야 함)
2. 2번째 비교 조건에서 return sumA < sumB가 통하는 이유를 모르겠다.