[C++] BOJ 1431번 : 시리얼 번호

2022. 1. 13. 22:12Programming Language/.Cpp

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> 

using namespace std;

/* 문제 조건
1. 길이 다름: 시리얼번호가 짧은 것
2. 길이 같: 모든 자리수 합이 작은 것 (숫자)
3. 둘다 같: 사전순 . 숫자 < 알파벳

* 설계
1. 스트링 길이 출력 // v[i].length? strlen(v[i])?
2. sum[a] vs sum[b].. 비교,  str[i] >= '0' && str[i]= '9' 일때, sum += str[i]-'0';

*/


int sumOfSerial(const string& a)
{
	int sum = 0;
	for (int i = 0; i < a.size(); i++)
	{
		if (a[i] >= '0' && a[i] <= '9') sum += a[i] - '0'; //char - 48 = int(c); == char - '0';
	}
	return sum;
}

bool compareSerial(const string& a, const string& b) {
	if (a.size() == b.size()) {
		if (sumOfSerial(a) == sumOfSerial(b)) return a < b; // 시리얼의 숫자 합이 같은 경우 사전 순 비교
		return sumOfSerial(a) < sumOfSerial(b); // 길이가 같을 때 숫자 합이 작은 것이 true 
	}
	else return a.size() < b.size(); // 길이가 다른 경우 짧은 것이 true
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int n;
	cin >> n;
	vector<string> v(n);
	
	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
	}
	sort(v.begin(), v.end(), compareSerial);
	for (int i = 0; i < n; i++)
	{
		cout << v[i] << '\n';
	}
}