⭐️ 정렬
string
이중 vector 에 입력하기ab123c
➡️ a
, b
, 123
, c
1
, 2
, 3
과 1
, 2
, 3
, c
를 비교하면 0~3번을 탐색하는 동안 결론이 안 나기 때문에 size가 더 큰 123c
가 뒤에 올 것이기 때문에 vector size가 작은 vector가 먼저 오는 것true
, 두번째 문자열의 size가 크면 false
returnfalse
return 하는 것대문자 > 소문자
인데 AaBb
처럼 알파벳 > 대문자 > 소문자
로 정렬해야 하기 때문정렬 기준이 방대할 경우, 커스텀하는데 익숙하지 않았음
문자열 문제는 감이 안 오면 정말 문제에서 하라는 대로 그대로 흐름을 따라가야 함
문자열을 분할할 때, 한 문자씩 분할하지만 숫자는 통으로 분할하는 것이 관건이었음
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool cmp(vector<string>& v1, vector<string>& v2) {
int len=min(v1.size(),v2.size());
for(int i=0;i<len;i++) {
if(v1[i]!=v2[i]) {
// 숫자 비교
if(v1[i][0]>='0'&&v1[i][0]<='9'&&v2[i][0]>='0'&&v2[i][0]<='9') {
string s1="",s2="";
for(int j=0;j<v1[i].size();j++) {
if(v1[i][j]!='0') {
s1=v1[i].substr(j);
break;
}
}
for(int j=0;j<v2[i].size();j++) {
if(v2[i][j]!='0') {
s2=v2[i].substr(j);
break;
}
}
if(s1==s2) return v1[i].size()<v2[i].size();
else {
if(s1.size()<s2.size()) return true;
else if(s1.size()>s2.size()) return false;
else {
if(s1<s2) return true;
return false;
}
}
}
// 문자 vs 숫자
if((v1[i][0]>='0'&&v1[i][0]<='9')||(v2[i][0]>='0'&&v2[i][0]<='9')) return v1[i]<v2[i];
if (toupper(v1[i][0]) == toupper(v2[i][0])) return v1[i] < v2[i];
return toupper(v1[i][0]) < toupper(v2[i][0]);
}
}
return v1.size()<v2.size();
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
vector<vector<string>> v;
for(int i=0;i<n;i++) {
string s;
cin >> s;
string tmp="";
vector<string> vs;
for(int j=0;j<s.size();j++) {
// 숫자
if(s[j]>='0'&&s[j]<='9') tmp+=s[j];
else {
if(tmp!="") vs.push_back(tmp);
tmp=s[j];
vs.push_back(tmp);
tmp="";
}
}
if(tmp!="") vs.push_back(tmp);
v.push_back(vs);
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++) {
for(int j=0;j<v[i].size();j++) {
cout << v[i][j];
}
cout << endl;
}
}