[문제]
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;
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스 Lv.2] [1차] 프렌즈4블록 (0) | 2025.05.16 |
|---|---|
| [프로그래머스 Lv.2] 오픈채팅방 (0) | 2025.05.16 |
| [프로그래머스 Lv.2] 2xn 타일링 (0) | 2025.05.15 |
| [프로그래머스 Lv.2] 숫자 변환하기 (0) | 2025.05.14 |
| [프로그래머스 Lv.2] 주차 요금 계산 (0) | 2025.05.14 |