#1. 문제
#2. 풀이
1. cctype 라이브러리
2. HEAD 추출 시, isalpha(c)가 아니라! isdigit(c)으로 확인하자.
- 먼저, 파일 정보를 담고 있는 구조체를 선언합니다.
- 각 파일 마다 이름, head, number, index 멤버의 정보를 계산합니다.
- 이때, head 추출 시 isalpha(c)로 할 경우, 특수 문자들에 대한 처리가 정상적으로 이루어지지 않아 오류가 발생합니다. 따라서,! isdigit(c)으로 확인합니다.
- 마지막으로, sort() 함수를 호출합니다. 이때, 별도로 정의한 Predicate 함수를 통해 그 우선순위를 결정해주어 정렬 작업을 수행합니다.
#3. 코드
/*
@링크: https://school.programmers.co.kr/learn/courses/30/lessons/17686
@문제: 세부 조건을 만족하는 파일 명 정렬 목록
@설명
1. HEAD 추출 시 isalpha(C)가 아니라, !isdigit(C)으로 추출(특수 문자 고려)
2. NUMBER 추출 시 최대 5글자 까지 검색을 수행하고, 0일 경우를 고려해야 한다.
*/
#include <string>
#include <vector>
#include <algorithm>
#include <cctype>
using namespace std;
struct FileInfo {
string name;
string head;
int number;
int Index;
};
bool compareFileInfo(const FileInfo& a, const FileInfo& b) {
if (a.head != b.head) return a.head < b.head;
if (a.number != b.number) return a.number < b.number;
return a.Index < b.Index;
}
vector<string> solution(vector<string> files) {
vector<FileInfo> fileInfos;
for(int i=0; i<(int)files.size(); ++i)
{
string file = files[i];
FileInfo info;
info.name = file;
info.Index = i;
int cur = 0;
//@HEAD 추출 (숫자가 나올 때까지)
while(cur < file.size() && !isdigit(file[cur]))
{
info.head += tolower(file[cur++]);
}
//@NUMBER 추출 (최대 5자리)
string tmp = "";
while(cur < file.size() && isdigit(file[cur]) && tmp.length() < 5)
{
tmp += file[cur++];
}
info.number = tmp.empty() ? 0 : stoi(tmp);
fileInfos.push_back(info);
}
stable_sort(begin(fileInfos), end(fileInfos), compareFileInfo);
vector<string> answer;
for(const auto& info : fileInfos)
{
answer.push_back(info.name);
}
return answer;
}
'문제 풀이 > Programmers 문제 풀이' 카테고리의 다른 글
[Programmers]#Level2_쿼드압축 후 개수 세기, 분할-정복, DFS (0) | 2024.08.02 |
---|---|
[Programmers, C++]#Level2_2개 이하로 다른 비트, 비트 연산자 (0) | 2024.08.02 |
[Programmers, C++]#Level2_주차 요금 계산, map 컨테이너 (0) | 2024.07.25 |
[Programmers]#Level2_압축, map, string (0) | 2024.07.25 |
[Programmers, C++]#Level3_야근 지수 (2) | 2024.07.24 |