본문 바로가기
Programming Solve/프로그래머스

프로그래머스 - 파일명 정리 / C++

by msm1029 2022. 3. 18.
반응형

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17686#

 

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

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

programmers.co.kr

 

 

문제 풀이

각각의 파일을 돌며 숫자가 나오기 전까진 head, 숫자가 나온 뒤부터는 number로 넣어준다.

숫자의 크기는 최대 5이다.

 

모두 추출하였으면 pair형태의 string, int로 넣어주고 다시 pair를 선언하여 앞에는 인덱스를 붙여준다.

즉, pair<int, pair<string, int> >의 형태가 된다.

 

다음으로, 정렬을 위한 compare 함수를 만들어준다. 정렬 순서는 head, number, index 순서이다.

이 때, sort 대신 stable_sort를 사용해야 에러가 나지 않는다.

 

정렬되었으면 정렬된 인덱스 순으로 answer에 push해준다.

 

 

코드

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

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

vector<string> solution(vector<string> files) {
    vector<string> answer;
    vector<pair<int, pair<string, int> > > v;
    
    for(int i=0; i<files.size(); i++){
        string head = "";
        int idx = 0;
        int num = 0;
        
        for(int j=0; j<files[i].size(); j++){
            if(isdigit(files[i][j])){
                idx = j;
                break;
            }
            else head += tolower(files[i][j]);
        }
        
        string tmp = "";
        
        for(int j=idx; j<files[i].size(); j++){
            if(('0' <= files[i][j] && files[i][j] <= '9') && tmp.size() < 5){
                tmp += files[i][j];
            }
            else break;
        }
        num = stoi(tmp);
        
        v.push_back({i, {head, num}});
    }
    
    stable_sort(v.begin(), v.end(), cmp);
    
    for(int i=0; i<v.size(); i++){
        answer.push_back(files[v[i].first]);
    }
    
    return answer;
}

 

시행착오

위의 코드에서 num = stoi(tmp)가 있다.

처음엔 이 코드를 else문 안에 포함시켰었는데, 이렇게 되면 오류가 발생한다.

예를 들어, "A00123"같은 경우 else문을 거치지 않고 for문을 빠져나오기 때문이다.

반응형