N

(프로그래머스 c++ KAKAO)파일명 정렬 본문

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

(프로그래머스 c++ KAKAO)파일명 정렬

naeunchan 2020. 7. 10. 10:29
728x90
반응형

파일명을 head, number, tail로 나누고

1. head의 오름차순으로 정렬

2. head가 같다면 number의 오름차순으로 정렬

3. head, number가 같다면 들어온 순서대로 정렬

을 진행해야 한다.

 

우선 head와 number를 나누도록 한다.

hc는 head check, nc는 number check로 각각 head와 number가 나눠졌는지 확인하기 위한 bool형 변수다.

이중for문을 이용하여 files[i][j]가 '0' ~ '9'가 아닌 부분은 head로 넣어준다.

hc == false라면 아직 head 부분이므로 소문자로 바꿔준 후, 넣어주도록 한다.

'0'~'9'라면 head부분은 끝났기 때문에 hc = true로 바꿔주고, 해당 부분은 number에 더해준다.

hc = true로 바뀌었고, nc는 여전히 false이므로 number를 넣어주면 된다.

문자열 숫자가 아닐 때까지 number에 넣어주고, 숫자가 아닌 경우 break.

이제 한 파일의 head와 number가 나뉘어졌으므로, vector에 넣어주면 된다.

vector<pair<string, pair<string, int>>> v는 head, number, index를 가지는 pair형 vector이다.

v에 넣어주고 hc, nc는 false로 바꿔 다음 file의 이름을 나눠주도록 한다.

 

모든 file이 v에 들어가게 되면 sort를 하도록 한다.

이때, 기본적인 sort함수는 불안정하다는 글을 보았다.

또한 sort함수를 이용하여 제출하면 대부분 케이스가 실패가 된다.

 

그래서 stable_sort함수를 사용하였다.

sort와 마찬가지로 함수를 정의해서 사용할 수 있다.

cmp 함수를 정의.

만약 a.first == b.first라면 head가 같다는 뜻이다.

또한 a.second.first == b.second.first라면 head와 number가 같다는 뜻이므로

들어온 순서대로 처리하도록 한다.

만약 head만 같다면 number를 int형으로 바꿔 숫자의 오름차순으로 정렬을 하도록 한다.

만약 a.first != b.first라면 head의 오름차순으로 정렬을 하면 된다. 

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

using namespace std;

bool cmp(pair<string, pair<string, int>> a, pair<string, pair<string, int>> b)
{
    if(a.first == b.first)
    {
        if(a.second.first == b.second.first)
            return a.second.second < b.second.second;
        return stoi(a.second.first) < stoi(b.second.first);
    }
    else
        return a.first < b.first;
}

vector<string> solution(vector<string> files) {
    vector<string> answer;
    string head = "", number = "";
    bool hc = false, nc = false;
    vector<pair<string, pair<string, int>>> v;
    
    for(int i = 0; i < files.size(); i++)
    {
        pair<string, int> p;
        
        for(int j = 0; j < files[i].size(); j++)
        {
            if(hc == false)
            {
                if(files[i][j] >= '0' && files[i][j] <= '9')
                {
                    hc = true;
                    number += files[i][j];
                }    
                else
                    head += tolower(files[i][j]);
            }
            else if(hc && nc == false)
            {
                if(files[i][j] >= '0' && files[i][j] <= '9')
                    number += files[i][j];
                else
                    break;
            }       
        }
        p = make_pair(number, i);
        v.push_back(make_pair(head, p));
        head = number = "";
        hc = nc = false;
    }
    
    stable_sort(v.begin(), v.end(), cmp);
    
    for(auto itr : v)
        answer.push_back(files[itr.second.second]);
    
    return answer;
}
728x90
반응형