https://www.acmicpc.net/problem/2870
N줄에 걸쳐 숫자와 알파벳 소문자로 되어있는 문자열이 입력으로 주어진다.
모든 입력에서 숫자를 모두 찾아서 비내림차순으로 정렬하는 문제다.
예를 들어, 01a2b3456cde478에서 숫자를 찾으면 1, 2, 3456, 478이다.
1) 문자열을 입력받고 for문을 통해 입력된 문자가 숫자인지 아닌지 체크한다.
isdigit(s[j])
이 true면 숫자다.
2) 해당 문자가 숫자면 결과 저장할 string에 append 해준다.res+=s[j]
3) res가 0인데 또 숫자가 입력되면 0을 지운 후 append 해준다.
4) 숫자가 아니면 숫자부분이 끝났으므로 res를 vector에 append 한다.
5) vector를 비교함수를 이용하여 오름차순으로 정렬한다.
🚨long long이 18자리 정도 되기때문에 문제에서 30자리 이상의 숫자를 처리하라고하면 숫자로는 처리할 수가 없다.
여기선 한 줄에 문자가 최대 100글자 들어오기 때문에 반드시 문자열로 접근해야한다.
(문자열을 숫자로 바꿔서 저장해서 정렬하려고해서 틀렸었다)
문자열 비교함수: 문자열 길이가 같으면 문자열을 비교하고 문자열 길이가 다르면 문자열 길이를 비교한다.
bool cmp(string a, string b) { if (a.size() == b.size()) { return a < b; } return a.size() < b.size(); }
#include<iostream>
#include<string>
#include <algorithm>
#include <vector>
using namespace std;
int n;
vector<string> a;
string res;
bool cmp(string a, string b) {
if (a.size() == b.size()) {
return a < b;
}
return a.size() < b.size();
}
int main() {
string s;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s;
for (int j = 0; j < s.length(); j++) {
if (isdigit(s[j])) {//숫자면
if (res.length() == 1 && res == "0") {
res = "";
}
res += s[j];
if (j == s.length() - 1) {
a.push_back(res);
res = "";
}
}
else {//문자면
if (res != "") {
//res에 뭐가 그전에 적혔으면
a.push_back(res);
}
res = "";
}
}
}
sort(a.begin(),a.end(),cmp);
for (int i = 0; i < a.size();i++) {
cout << a[i] << "\n";
}
}