#include <string>
#include <vector>
#include <algorithm>
#include <regex>
using namespace std;
bool comp(string a, string b) {
regex pat(R"(([^0-9]+)(0*([0-9]{1,5}))(.*))");
smatch mat;
regex_match(a, mat, pat);
string head1 = mat[1];
string number1 = mat[2];
regex_match(b, mat, pat);
string head2 = mat[1];
string number2 = mat[2];
transform(head1.begin(), head1.end(), head1.begin(), ::tolower);
transform(head2.begin(), head2.end(), head2.begin(), ::tolower);
int n1 = stoi(number1);
int n2 = stoi(number2);
return head1 == head2 ? n1 < n2 : head1 < head2;
}
vector<string> solution(vector<string> f) {
stable_sort(f.begin(), f.end(), comp);
return f;
}
처음에 Regular expression까지는 괜찮았는데 통과가 되지않았는데, 아무리 생각해봐도 안 될 이유가 없었다.
1 -> ([^0-9]+) : 숫자가 아닌 문자로 이루어진 "head"를 찾음.
2 -> (0*([0-9]{1,5})) : 0으로 시작할 수 있고, 0부터 99999 사이의 숫자 (1자리 - 5자리)로 이루어진 "number"를 찾음.
3 -> (.*) : 숫자 뒤는 tail로 처리.
이런 과정으로 파싱한 뒤 head는 소문자로 바꿔주고, number은 0101과 같은 문자들을 101로 바꿔주어야 하므로 int로 변경,
그 후 head가 서로 같으면 stoi로 형변환을 마친 n1과 n2를 비교해주고, head가 다르다면 head1과 head2를 비교해서 정렬했다.
그러나 아무리 해도 반례를 찾을 수 없었고, regex를 이용해서 풀면 안되는 문제인가 생각하던 중,
c++의 내장 정렬 함수는 unstable_sort라는 사실을 깜빡하고 있었다.