문자열
과 커스텀 정렬
로 푸는 문제
여기서 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
이라는 의미이므로 처리할 필요가 없어서break
head
와 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;
}