C/C++ 2018 KAKAO BLIND RECRUITMENT [3차] 파일명 정렬 본문

알고리즘_프로그래머스/KAKAO

C/C++ 2018 KAKAO BLIND RECRUITMENT [3차] 파일명 정렬

giron 2021. 8. 6. 15:46
728x90

처음 풀때는 단순히 정렬 기준 2개잡고 문자열 자르고, 소문자 만들고, int형변환 해주고, 등 귀찮은 정렬문제라고 생각했다. 그래서 백준 골드5? 실버? 사이쯤 된다고 생각해서 막힘없이 풀었는데 계속 테스트1, 2만 통과되고 나머지가 안되어서 결국 질문하기를 보았는데... 원인은 일반적 sort는 unstable해서 기존의 상태가 보장되지 않는다고 합니다. 그래서 stable_sort를 써야 한다고 한다...

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

vector<pair< string,pair<string, int>>> v;
bool compare(const pair<string, pair<string, int>>& a,const pair<string, pair<string, int>>& b){
    if(a.second.first == b.second.first){
        return a.second.second < b.second.second;
    }
    return a.second.first < b.second.first;
}
string head;
string number;
int check;
vector<string> solution(vector<string> files) {
    vector<string> answer;
    int cut=0;
    for(int i=0;i<files.size(); ++i){
        check=0;
        head="";
        number="";
        for(int j=0;j<files[i].size(); ++j){
            if(check == 0 && files[i][j]>='0' && files[i][j]<='9'){
                //head자르기
                head = files[i].substr(0,j);
                check=1;cut=j;
                continue;
            }
            if(check==1 && (files[i][j]<'0' || files[i][j]>'9')){
                number = files[i].substr(cut,j-cut);
                check=2;
                break;
            }
        }
        
        if(check != 2){
            number = files[i].substr(cut);
        }
        
        for(int k=0;k<head.size(); ++k){
            head[k]=tolower(head[k]);
        }
        int num = stoi(number);
        v.push_back({files[i],{head, num}});
        
    }
    stable_sort(v.begin(), v.end(), compare);
    for(int k=0;k<v.size();++k){
            answer.push_back(v[k].first);
    }
    return answer;
}

 

728x90
Comments