음 일단 조금은 알겠는데 시간 넘겨서 강의 들으러 옴.
아스키 코드값으로 0~9사이의 값인지 아닌지 판별해서 어쩌구 할려고 했는데 생각보다 많이 까다롭다.
이 문제는 int, long long 안된다는것을 바로 인지를 하고 string을 사용해주어야한다.
또한 일단 문제에서 입력받는 문자열은 소문자랑 숫자밖에 없다고 했는데,
지금 나처럼
48 <= s[j] && s[j] <= 57;
이런식으로 할 게 아니라 그냥 65보다 작다면으로 수정해버리면 더 간결해진다. (문제에서 정했으니까)
또한 go함수를 보면은
이런식으로 while 뒤에if문 하나 더 있는데 있는 이유는
모든 숫자가 '0000'이럴 경우에 '0'이 나와야 하기 때문에 이런식으로 변경함.
정수는 오름차순으로 정렬하면 그냥 정렬 잘 된다.
하지만 문자열을 기반으로 정렬을 하게되면은 아스키 코드 값을 기준으로 정렬한다.(ㅇㅇ 그렇지)
"20", "123" 을 비교한다고 했을 때
"20"의 '2'가 "123"의 '1'보다 아스키 코드 값이 크기 때문에오름차순으로 장렬하면 "123"이 제일 앞으로 간다.
.
atoi사용하던가 cmp같은 함수 만들어서 사용하든가
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define endl "\n"
int n, ncnt;
vector<int> v;
string s;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> s;
int start = 0, end = 0, ncnt = 0;
for (int j = 0; j < s.size(); ++j)
{
if (48 <= s[j] && s[j] <= 57)
{
++ncnt;
if (ncnt == 1) start = j;
if (j == s.size() - 1 && ncnt != 0)
goto el;
}
else
{
el:
if (ncnt != 0)
{
end = j; ncnt = 0;
string c = s.substr(start, end);
reverse(c.begin(), c.end());
for (int k = 0; k < c.size(); ++k)
{
if (c[k] == 48)
{
c = c.substr(0, k);
reverse(c.begin(), c.end());
}
}
v.push_back(atoi(c.c_str()));
}
}
}
int a = 10;
}
return 0;
}
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define endl "\n"
int n;
vector<string> v;
string s, ret;
void go()
{
while (1)
{
if (ret.size() && ret.front() == '0') ret.erase(ret.begin());
else break;
}
if (ret.size() == 0) ret = '0';
v.push_back(ret);
ret = "";
}
bool cmp(string a, string b)
{
if (a.size() == b.size()) return a < b;
return a.size() < b.size();
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> s;
ret = "";
for (int j = 0; j < s.size(); ++j)
{
if (s[j] < 65) ret += s[j];
else if (ret.size()) go();
}
if (ret.size()) go();
}
sort(v.begin(), v.end(), cmp);
for (string i : v) cout << i << endl;
return 0;
}