Doby's Lab

[C++] 백준 1431번: 시리얼 번호, sort에서 더 깊게 파고든 compare 본문

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가 통하는 이유를 모르겠다.

728x90