[Programmers] 파일명 정렬

파일명을 크기에 맞게 정렬하는 문제이다.

문제 해결 전략
문자열을 헤더 부분과 숫자 부분을 잘 자르고 정렬하는 문제이다.

하지만 조건으로 만약 헤더와 숫자 부분이 모두 같으면 입력한 순서를 유지하라고 한다.

이 조건을 만족시키면서 정렬을 해야 한다.

들어온 순서를 유지하기 위한 방법은 두가지 방법이 있다.

  • 순서를 저장하여 헤더와 숫자가 같으면 순서를 비교하여 정렬하도록 한다.
  • stable_sort()를 사용하여 조건이 같을 때 순서를 유지한다.

아래의 코드는 첫번째 방법을 사용한 것으로 순서 역시 비교 인자로 저장하여 앞의 두 조건이 모두 같으면 순서를 비교하도록 한 코드이다.

두번째 방법을 사용하는 방법은 그냥 sort대신 stable_sort를 사용하면 된다.

  • 비교함수 만들기
bool compare (const 변수형& a, const 변수형& b){
    return (a가 b보다 앞에 올 조건);
    // 만약 오름차순으로 정렬하고 싶으면 return a < b 를 하면 됨
}

위와 같이 함수를 만든 후 sort(v.begin(), v.end(), compare) 를 실행하면 된다.

참고 : 비교함수 만들기

코드

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

using namespace std;
vector<string> solution(vector<string> files) {
	vector<string> answer;
    vector<pair<pair<string, int>,pair<int,string>>> v;
    for(int i=0;i<files.size();i++){
        int flag = 0;
        string head = "";
        string num = "";
        for(int j=0;j<files[i].size();j++){
            if(files[i][j]>='0' && files[i][j]<='9'){
                if(flag == 0){
                    num += files[i][j];
                    flag = 1;
                }else{
                    num += files[i][j];
                    if(num.size() == 5 || j == files[i].size()-1){
                        break;
                    }
                }
            }else{
                if(flag == 0){
                    head += toupper(files[i][j]);
                }else if(flag == 1){
                    break;
                }
            }
        }
        int t = stoi(num);
        v.push_back(make_pair(make_pair(head,t),make_pair(i,files[i])));
    }
    
	sort(v.begin(), v.end());
    for(int i=0;i<v.size();i++){
        answer.push_back(v[i].second.second);
    }
	return answer;
}

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

좋은 웹페이지 즐겨찾기