ALGORITHM/Kakao

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

김쿸후 2021. 3. 20. 00:33

1. 문제

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

 

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

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

programmers.co.kr

2. 풀이

C++의 엄청난 기능 pair을 이용하여 간단하게 풀 수 있다!

문제는 배열을 정렬할 때의 함수를 만드는게 조금 까다로웠다. 

pair 안에 pair가 있는 구조였기 때문에 pair의 first , second 기능을 적극 활용하면 된다. 

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

 

3. 코드

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

using namespace std;

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

vector<string> solution(vector<string> files) {
    
    vector<string> answer;
    vector<pair<string,pair<int, int>>> newFiles;
    string head = "";
    string number = "";
    
    //newFiles 벡터 만들기
    for(int i = 0; i < files.size();i++){
        head = "";
        number = "";
        pair<int, int> numpair;
        int next = files[i].length() -1;
        
        //숫자가 아닐때 =>head
        for(int j = 0; j < files[i].length();j++){
            //숫자면 중지
            if(files[i][j] >= '0'&& files[i][j] <= '9'){
                next = j; 
                break;
            }
           else{
            //대문자라면
            if((files[i][j] >= 'A') && (files[i][j] <= 'Z')){
                head+=tolower(files[i][j]);
            }
            else{head+=files[i][j];}
            }
        }

        //숫자일때 -> numb
        for(int j = next; j < files[i].length();j++){
            if(j > next + 4){break;}
            if(files[i][j] >= '0'&& files[i][j] <='9'){
            number+= files[i][j];
            }
            else{break;}
        }
        if(number ==""){number = "0";}
        
        //숫자로 변경
        int num = stoi(number);
        numpair = make_pair(num, i);
        newFiles.push_back(make_pair(head, numpair));
    }
    
    stable_sort(newFiles.begin(),newFiles.end(),cmp);
    
    for(auto itr : newFiles)
        answer.push_back(files[itr.second.second]);
    
    return answer;
}

 

4. 그외

while문으로 했는데 디지게 시간 초과나서 포문으로 바꿨더니 됐다..

대체 뭐가 문제였던건지는 몰겠다ㅠㅠ

그래도 해결했으니 뭐,, 

내일은 드디어 주말!! 밀린 강의를 좀 들어야겠다ㅠㅠ