프로그래머스/lv2/17686.[3차]파일명 정렬 2018 KAKAO BLIND RECRUITMENT

SITY·2023년 11월 2일
0

Cpp_Algorithm

목록 보기
39/43

#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라는 사실을 깜빡하고 있었다.

profile
·ᴗ·

0개의 댓글