- sort, stabl_sort
- string의 substr와 transform(위와 동일한 페이지 설명)
Sorting과 String의 함수들을 알고 있었다면 쉽게 풀 수 있었던 문제지만, 모른다면 정말 어려운 문제
다음과 같이 구성되어 있는 파일명을 조건에 맞게 정렬하여라.
파일명 = Head(문자) + Number(숫자) + Tail(문자, 숫자, NULL)
조건
ex)
input -> ["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"]
output -> ["img1.png", "IMG01.GIF", "img02.png", "img2.JPG", "img10.png", "img12.png"]
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int find_num(string st){ //첫 번째 Number자리를 찾는 함수
int i;
for(i=0; i<st.size(); i++){
if(st[i]>='0'&&st[i]<='9'){
break;
}
}
return i;
}
int getNumber (string st){ //string에서 Number만 추출한다.
return stoi(st.substr(find_num(st))); //stoi는 string의 Number의 첫 번째 자리가 필요하다.
}
string getHead(string st){ //Head를 찾는 함수
int start=find_num(st);
string result;
result=st.substr(0, start); //처음부터 Number를 시작하기 전 index까지 저장.
return result;
}
bool compNum (string a, string b){ //sort를 위한 Number 비교 함수
return getNumber(a)<getNumber(b);
}
bool compHead(string a, string b){ //sort를 위한 Head 비교 함수
string first;
string last;
first = getHead(a);
last = getHead(b);
transform(first.begin(), first.end(), first.begin(), ::tolower);//모든 string 소문자로 전환.
transform(last.begin(), last.end(), last.begin(), ::tolower);
return first < last ;
}
vector<string> solution(vector<string> files) {
vector<string> answer;
//stable_sort로 기존의 정렬 유지.
stable_sort(files.begin(),files.end(),compNum); //Number기준 정렬.
stable_sort(files.begin(),files.end(),compHead); //Head기준 정렬.
return files;
}