본문 바로가기

Algorithm/Sorting

(C++) - 프로그래머스(2018 KAKAO BLIND RECRUITMENT[3차]) : 파일명 정렬

반응형

 

https://programmers.co.kr/learn/courses/30/lessons/17686

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

문자열 파싱 후 정렬하는 문제였습니다.

 

풀이방법

 stl sort함수는 unstable quick sort입니다. 따라서 정해진 기준 외에 놔둬야 하는 문자열들의 서순이 뒤바뀔 수 있습니다. 때문에 stable_sort함수를 사용해 기준이 없는 문자열의 서순을 바꾸지 않도록 한다면 맞을 수 있습니다.

 

 1. Head, Number를 문자열 파싱으로 구합니다.

 

 2. Tail은 정렬기준에 해당하지 않기 때문에 Number를 구할때 첫번째로 숫자가 나온 문자부터 끝까지 떼어 옵니다. 그 후 stoi함수의 인자로 넘겨준다면 숫자인 부분까지 알아서 int형으로 바꾼 후 반환해줍니다.

 

Code

#include <bits/stdc++.h>
using namespace std;

string getHead(string s){
    string tmp;
    string tmpS = s;
    for(int i = 0; i < tmpS.size(); i++){
        if('0' <= tmpS[i] && tmpS[i] <= '9') break;
        if('A' <= tmpS[i] && tmpS[i] <= 'Z') tmpS[i] = tmpS[i] - 'A' + 'a';
        tmp += tmpS[i];
    }
    return tmp;
}

string getNumber(string s){
    int idx = 0;
    for(int i = 0; i < s.size(); i++){
        if('0' <= s[i] && s[i] <= '9'){
            idx = i;
            break;
        }
    }
    return s.substr(idx);
}


bool cmp(string a, string b){
    string aHead = getHead(a);
    string bHead = getHead(b);
    if(aHead == bHead){
        string aNum = getNumber(a);
        string bNum = getNumber(b);
        return stoi(aNum) < stoi(bNum);
    }
    return aHead < bHead;
}

vector<string> solution(vector<string> files) {
    stable_sort(files.begin(),files.end(),cmp);
    return files;
}