3번 문제로 넘어가보겠습니다. 3번 문제 역시 큰 틀에서는 구현문제입니다. 얼핏 보면 까다로운 것 같지만 이 문제는 1,2 번에 비해 굉장히 쉬운문제입니다. 파일명이 주어지고 이를 정렬하는데, 우선 반드시 head,number,[tail]의 순서로 파일명이 되어 있음이 보장됩니다. 또 숫자가 5글자 이내이기 때문에 long long 으로 처리할 수 없는 큰 숫자가 나오는 경우도 없습니다.
때문에 while 문을 통해 간단하게 head, number, [tail]을 저장할 수 있으며, 이를 기준으로 sort를 하면 됩니다. 단, 결과가 같은 경우 이전의 파일 순서를 유지해야 한다고 했으므로, 간단히 파일이 들어온 순서대로 번호를 매겨 결과가 같은 경우 숫자가 더 작은 쪽을 앞으로 두면 됩니다. 1번부터 3번까지 별도의 알고리즘 능력을 평가하기 보다는 구현을 얼마나 정확히 할 수 있는가를 평가하는 것 같았습니다.
class Node
{
public:
int no;
string ohead, onumber, otail;
string head, number, tail;
bool operator <(const Node &n) const
{
if (head != n.head) return head < n.head;
if (number != n.number) return stoi(number) < stoi(n.number);
return no < n.no;
}
};
vector<string> solve(vector<string> files)
{
vector<Node> v(files.size());
vector<string> ans;
int idx = 0;
for (string file : files)
{
int i = 0;
v[i].no = idx;
while (!('0' <= file[i] && file[i] <= '9')) v[idx].head += file[i++];
while (('0' <= file[i] && file[i] <= '9')) v[idx].number += file[i++];
while (i < file.length()) v[idx].tail += file[i++];
idx++;
}
for (int i=0; i<v.size(); i++)
{
auto &it = v[i];
it.ohead = it.head, it.otail = it.tail;
transform(it.head.begin(), it.head.end(), it.head.begin(), ::toupper);
transform(it.tail.begin(), it.tail.end(), it.tail.begin(), ::toupper);
}
sort(v.begin(), v.end());
for (auto it : v)
ans.push_back(it.ohead + it.number + it.otail);
return ans;
}