
문자열과 커스텀 정렬로 푸는 문제
여기서 sort함수로 풀면 1,2번만 맞고 stable_sort로 푸니까 다 맞았다..
stable_sort는 두 요소 간의 순서를 보장하는 함수!
예를 들어 {1,5,4,5,3}이라는 벡터를 정렬 할 때 {1,3,4,5,5}로 정렬이 될텐데 그냥 sort는 5 요소 두 개가 같은 값이니 순서가 보장 되지 않아 앞의 5가 뒤로 갈 수 있지만, stable_sort는 이 두 개의 5 순서를 보장한다.
File을 정의해 name에는 원래 파일명, head와 number에는 문제대로 넣기로 한다.seperate 함수를 이용해 파일명을 head와 number로 나눈다. tail은 정렬하는 데에 필요없으니 패스file[i]이 숫자면 numberFlag를 true로 하고 number string에 넣어준다.numberFlag가 false면 아직 number가 없었다는 뜻, 즉 head란 뜻이므로 head에 toupper로 대문자 변환해서 넣어준다. 대문자 변환을 하는 이유는 문제에서 대소문자 상관없이 처리하기 위함이다.numberFlag가 true면 tail이라는 의미이므로 처리할 필요가 없어서breakhead와 number를 구조체로 만들어 return. 정렬을 해야하기 때문에 number는 stoi로 int 형변환을 해준다.compare은 구조체 File로 입력을 받아서 두 개의 head로 오름차순 정렬, head가 같다면 number로 정렬을 해준다.arr를 answer에 name만 push_back 해주면 끝.#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct File
{
string name;
string head;
int number;
};
File seperate(string file)
{
string head = "";
string number = "";
bool numberFlag = false;
for(int i=0;i<file.size();i++)
{
if('0'<=file[i] && file[i]<='9')
{
numberFlag = true;
number+=file[i];
}
else
{
if(!numberFlag) head += toupper(file[i]);
else break;
}
}
File f = {file, head, stoi(number)};
return f;
}
bool compare(File a, File b)
{
if(a.head == b.head) return a.number < b.number;
return a.head < b.head;
}
vector<string> solution(vector<string> files) {
vector<string> answer;
vector<File> arr;
for(int i=0;i<files.size();i++)
{
arr.push_back(seperate(files[i]));
}
stable_sort(arr.begin(), arr.end(),compare);
for(int i=0;i<arr.size();i++)
{
cout<<arr[i].head<<" "<<arr[i].number<<endl;
answer.push_back(arr[i].name);
}
return answer;
}