[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#
Author And Source
이 문제에 관하여([Programmers] 파일명 정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kms9887/Programmers-파일명-정렬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)