[21410][伯俊/BOJ]1431番シリアル番号


質問する



にゅうしゅつりょく



に答える


文字列を3つの条件で並べ替えた問題.
  • 文字列の長さが異なり、短いのはまず
  • です.
  • の長さが等しい場合、AとBの数字の和を比較すると、小数和はまず
  • である.
  • が1、2番の条件で比較できない場合、辞書順
  • である.

    コード#コード#

    #include <bits/stdc++.h>
    using namespace std;
    
    bool cmp(string a, string b)
    {
    	if (a.size() != b.size()) // 길이 다르다면
    		return a.size() < b.size();
    	else // 같다면
    	{
    		int alen = 0, blen = 0;
    		for (int i = 0; a[i] != '\0'; ++i)
    		{
    			if (a[i] >= '0' && a[i] <= '9')
    				alen += a[i] - '0';
    			if (b[i] >= '0' && b[i] <= '9')
    				blen += b[i] - '0';	
    		}
    		if (alen != blen) // 작은 합 먼저
    			return alen < blen;
    		else
    			return a < b;
    	}
    }
    int main(void)
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	
    	int n;
    	cin >> n;
    	vector<string> SN;
    
    	while (n--)
    	{	
    		string str;
    		cin >> str;
    		SN.push_back(str);
    	}
    
    	sort(SN.begin(), SN.end(), cmp);
    
    	for (auto &e : SN)
    		cout << e << ' ';
    }