#include <algorithm>
#include <string>
#include <vector>
using namespace std;
bool comp(string a, string b) { return a + b > b + a; }
string solution(vector<int> numbers) {
string answer = "";
vector<string> arr;
bool flag = true;
for (int i = 0; i < numbers.size(); i++) {
arr.push_back(to_string(numbers[i]));
if (numbers[i] != 0) flag = false;
}
if (flag) return "0";
sort(arr.begin(), arr.end(), comp);
for (int i = 0; i < arr.size(); i++) answer += arr[i];
return answer;
}
간단히 생각해야 하는 문제다.
처음엔 자릿수마다 모든 값을 큰 순서로 stack을 만들려고 했지만,
가장 쉬운 방법은 문자열을 이용하는 방식으로 정렬 방식을 지정해주면 된다.
해당 문제의 실제 두 번째 테스트 케이스인 [3, 30, 34, 5, 9]을 기준으로 살펴보면,
comp("3", "30")은 "330"과 "303"을 비교하고 "330"이 더 크므로 "3"이 "30"보다 앞에 정렬된다.
comp("30", "34")은 "3034"과 "3430"을 비교하고 "3430"이 더 크므로 "34"가 "30"보다 앞에 정렬된다.
comp("34", "5")은 "345"과 "534"을 비교하고 "534"이 더 크므로 "5"가 "34"보다 앞에 정렬된다.
comp("5", "9")은 "59"과 "95"를 비교하고 "95"가 더 크므로 "9"가 "5"보다 앞에 정렬된다.
문자열 a, b의 앞, 뒤를 더한 문자열과, 뒤, 앞을 더한 문자열을 비교해주는 것이 핵심 로직이다.
모든 값이 0일 때를 생각해서 모든 값이 0이면 모든 값을 더해줄 때 000..으로 출력되므로 예외처리를 해준다.