본문 바로가기

백준/실버

[백준 1431번] 시리얼 번호 (C++)

문제링크 : https://www.acmicpc.net/problem/1431

 

1431번: 시리얼 번호

첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = INT_MAX;

int N;
string arr[51];

int func(string s)
{
    int sum = 0;
    for(int i=0; i<s.size(); i++)
    {
        if(isdigit(s[i])) sum += s[i]-'0'; //문자열에서 숫자만
    }
    return sum;
}

bool cmp(string s1, string s2)
{
    if(s1.size()==s2.size())
    {
        if(func(s1) == func(s2)) return s1 < s2; //사전순
        else return func(s1) < func(s2); //작은순
    }
    else return s1.size() < s2.size(); //짧은순
}

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

    cin >> N;

    for(int i=0; i<N; i++) cin >> arr[i];

    sort(arr, arr+N, cmp);

    for(int i=0; i<N; i++) cout << arr[i] << "\n";

    return 0;
}

 

문제에 주어진 조건에 따라 따로 정렬용 함수를 만들어서 적용해주어야한다.

1. 문자열의 길이가 짧은 순
2. 문자열의 길이가 같다면 문자열에서 숫자합이 작은 순
3. 문자열의 길이도 같고, 숫자합도 같다면 사전순

 

숫자합을 구하는 과정에서 말그대로 문자열내에 속한 숫자만 찾아 더해주어야한다.

이를 위해 isdigit 함수를 이용하면 쉽게 문자열 내 숫자의 체크가 가능하다.