https://programmers.co.kr/learn/courses/30/lessons/17686
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct CON
{
string Head;
string Head1;
string Number;
int iNumber;
string Tail;
int order;
};
bool cmp(CON a, CON b)
{
if (a.Head1 == b.Head1)
{
if (a.iNumber == b.iNumber)
{
return a.order < b.order;
}
else
{
return a.iNumber < b.iNumber;
}
}
else
{
return a.Head1 < b.Head1;
}
}
vector<string> solution(vector<string> files) {
vector<string> answer;
vector<CON> vTemp;
for (int i = 0; i < files.size(); i++)
{
int flag(0);
int istop(0);
int numstart(0);//숫자시작하는부분
int numend(0);//숫자 끝나는부분
for (int j = 0; j < files[i].size(); j++)
{
if (files[i][j] >= '0' && files[i][j] <= '9' && flag == 0)
{
flag = 1;
numstart = j;//숫자 시작하는 부분
}
if (files[i][j] >= '0' && files[i][j] <= '9' && flag == 1 && (files[i][j + 1]<'0' || files[i][j + 1]>'9') && istop == 0)
{
numend = j;
istop = 1;
}
if (j == files[i].size() - 1)
{
CON conTemp;
conTemp.Head = files[i].substr(0,numstart);//숫자 처음 시작하는곳 전까지 짜른다.
string sTemp = conTemp.Head;
for (int j = 0; j < sTemp.size(); j++)
{
sTemp[j] = tolower(sTemp[j]);
}
conTemp.Head1 = sTemp;
conTemp.Number = files[i].substr(numstart, numend - numstart+1);
conTemp.iNumber = stoi(conTemp.Number);
conTemp.Tail = files[i].substr(numend+1);
conTemp.order = i;
vTemp.push_back(conTemp);
}
}
}
sort(vTemp.begin(), vTemp.end(), cmp);
for (int i = 0; i < vTemp.size(); i++)
{
string sTemp = vTemp[i].Head + vTemp[i].Number + vTemp[i].Tail;
answer.push_back(sTemp);
}
return answer;
}
구조체 정렬 + 문자열 짜르기 좋은 예시였음.
1] string 할때,
string(0,x) : 0~x-1인덱스까지 짜름.
string(x) : x에서 끝까지 문자열 다자름.
stoi("011") : 11이 됨
2] 이 문제에서 고려해야 한건.
우선순위를 고려하고(들어온 순서대로 그대로 정렬) 숫자또한 0을 제외하고 정렬해야함.
typedef struct CON
{
string Head;
string Head1;
string Number;
int iNumber;
string Tail;
int order;
};
그래서 다음과 같은 string Head1과 int iNum까지 추가로 넣은다음
최종적으로 구조체중에서 필요한 정보만 합쳤다.