[210410][백준/BOJ] 1431번 시리얼 번호

문제

입출력


풀이

문자열을 3개의 조건에 따라 정렬하는 문제이다.

  1. 두 문자열의 길이가 다를때, 짧은 것 먼저
  2. 길이가 같으면, A와 B의 숫자의 합을 비교해서 작은합이 먼저
  3. 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 << ' ';
}

좋은 웹페이지 즐겨찾기