728x90
🏆 목차.
🛒 문제
🎨 코드
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int sumLength(string str)
{
int result = 0;
for (char ch : str)
{
if (ch >= '0' && ch <= '9')
result += ch - '0';
}
return result;
}
bool compare(string a, string b)
{
if (a.length() < b.length()) return 1;
else if (a.length() > b.length()) return 0;
else
{
int sumA = sumLength(a);
int sumB = sumLength(b);
if (sumA != sumB) return sumA < sumB;
else return a < b;
}
}
int main()
{
vector<string> vec;
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
string str;
cin >> str;
vec.push_back(str);
}
sort(vec.begin(), vec.end(), compare);
for (auto au : vec)
{
cout << au << "\n";
}
}
🎯 풀이
이번 문제도 sort 함수를 사용해 간단하게 해결이 가능합니다.
문제에서 제시하는 조건은 3가지입니다.
1. A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
if (a.length() < b.length()) return 1;
else if (a.length() > b.length()) return 0;
a의 길이가 짧으면 먼저 오게 했습니다.
2. 만약 서로 길이가 같다면, A의 모든 자릿수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저 온다(숫자인 것만 더한다)
int sumLength(string str)
{
int result = 0;
for (char ch : str)
{
if (ch >= '0' && ch <= '9')
result += ch - '0';
}
return result;
}
숫자인 것만 더한다고 했으니 조건문을 통해서 string에서 숫자만 더하도록 했습니다.
그렇게 나온 자릿수의 합이 같지 않다면 작은 것이 먼저 오도록 했고,
그게 아니라면 같다는 뜻으로 사전순으로 비교하게 했습니다.
참고로 return a <b와 같이 작성하면 자동으로 사전순으로 비교할 수 있습니다.
int sumA = sumLength(a);
int sumB = sumLength(b);
if (sumA != sumB) return sumA < sumB;
else return a < b;
728x90
'코딩테스트' 카테고리의 다른 글
[C++] 백준 3009번 : 네 번째 점 (0) | 2024.02.18 |
---|---|
[C++] 프로그래머스 : 문자열 겹쳐쓰기(replace) (1) | 2023.11.12 |
[C++][sort] 백준 1181번 : 단어 정렬 (0) | 2023.11.08 |
[C++][DP] 백준 11727번 : 2xn 타일링 2 (0) | 2023.10.20 |
[C++][DP] 백준 11726번 : 2xn 타일링 (1) | 2023.10.19 |