문제링크 : https://www.acmicpc.net/problem/1431
#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 함수를 이용하면 쉽게 문자열 내 숫자의 체크가 가능하다.
'백준 > 실버' 카테고리의 다른 글
[백준 15565번] N과 M (11) (C++) (0) | 2024.03.28 |
---|---|
[백준 5568번] 카드 놓기 (C++) (0) | 2024.03.27 |
[백준 15664번] N과 M (10) (C++) (0) | 2024.03.25 |
[백준 20920번] 영단어 암기는 괴로워 (C++) (0) | 2024.03.24 |
[백준 15655번] N과 M (6) (C++) (0) | 2024.03.23 |