[문제]

https://school.programmers.co.kr/learn/courses/30/lessons/17686

 

[풀이]

 

먼저 files의 값들에 대해, 정렬 기준인 두 가지(HEAD, NUMBER)를 추출한다. 이제 추출한 값을 FileData 구조체에 넣고, 이 구조체의 Head와 Number에 대해 정렬을 실시한다. 정렬 기준은 비교하려는 두 자료형에 대해 같은 이름이라면 NUMBER를 기준으로, 다른 이름이라면 HEAD를 기준으로 정렬한다. 정렬 시 대소문자를 가리지 않기 때문에 toupper를 하면서 정렬해줘야한다.

#include <string>
#include <vector>
#include <algorithm>
#include <cctype>

using namespace std;

string ToUpper(const string& _Str)
{
    string Result;
    for (char ch : _Str)
    {
        Result += toupper(ch);
    }
    return Result;
}

struct FileData
{
    string Head;
    string Original;
    int Number;

    FileData(const string& _Head, int _Number, const string& _Original) 
        : Head(_Head), Original(_Original), Number(_Number) {}
};

bool Compare(const FileData& _Left, const FileData& _Right)
{
    string HeadLeft = ToUpper(_Left.Head);
    string HeadRight = ToUpper(_Right.Head);

    if (HeadLeft != HeadRight)
    {
        return HeadLeft < HeadRight;
    }

    return _Left.Number < _Right.Number;
}

vector<string> solution(vector<string> files)
{
    vector<FileData> parsedFiles;

    for (const string& file : files)
    {
        string HeadString = "";
        string NumberString = "";
        int Index = 0;
        int Length = file.length();

        // HEAD 추출
        while (Index < Length && !isdigit(file[Index]))
        {
            HeadString += file[Index++];
        }

        // NUMBER 추출
        while (Index < Length && isdigit(file[Index]) && NumberString.length() < 5)
        {
            NumberString += file[Index++];
        }

        int Number = stoi(NumberString);
        parsedFiles.emplace_back(HeadString, Number, file);
    }

    stable_sort(parsedFiles.begin(), parsedFiles.end(), Compare);

    vector<string> answer;
    for (const auto& file : parsedFiles)
    {
        answer.push_back(file.Original);
    }

    return answer;
}

+ Recent posts