Mini

백준 2870 //vector<string>정렬은 커스텀으로, string토큰화 본문

Algorithm/boj

백준 2870 //vector<string>정렬은 커스텀으로, string토큰화

Mini_96 2023. 5. 4. 17:24

2870번: 수학숙제 (acmicpc.net)

 

2870번: 수학숙제

종이에서 찾은 숫자의 개수를 M이라고 하면, 출력은 M줄로 이루어져야 한다. 각 줄에는 종이에서 찾은 숫자를 하나씩 출력해야 한다. 이때, 비내림차순으로 출력해야 한다. 비내림차순은 내림차

www.acmicpc.net

* 토큰화

for(s.len){

숫자면 ret누적

아니고 토큰잇으면 ->go

}if(남음)->go //뒤에 su00이런경우 처리

 

* go()

1.앞의 0지우기

2.모두지웟는데 빈칸 == 000이런경우 ret=0

3.v.push(ret)

4.ret초기화

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
int n, c, a[1004];
map<int, int> mp;  //인덱스,모음(1)자음(2)
string s,num;
vector<string> v;

/*
* 단점:string 기본정렬은 사전순임 ex(43, 23333 )으로 정렬됨
* 해결:커스텀정렬(사이즈순,사이즈같으면 사전순)
*/
bool cmp(string a, string b)
{
    if (a.size() == b.size()) return a < b;
    return a.size() < b.size();
}
void go()
{
    while (true)
    {
        if (num.size() && num.front() == '0') num.erase(num.begin());
        else break;
        
    }
    if (num.size() == 0)num = "0";
    v.push_back(num);
    num = "";
}

int main() {
    ios_base::sync_with_stdio(0); 
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> n;
    while (n--)
    {
        cin >> s;
        num = "";
        for (int i = 0; i < s.length(); ++i)
        {
            if (s[i] >= 48 && s[i] <= 57)
            {
                num += s[i];
            }
            else if (num.size()) go();
        }
        if (num.size()) go();
    }
    
    sort(v.begin(), v.end(),cmp);
    for (auto s : v) cout << s << "\n";
    
    return 0;
}