숫자를 문자열로 바꿔서 오름차순 정렬하기
3
과 30
이 있을 때 위 방법으로 연결하면 303
이 제일 크다고 판단하지만 실제로는 330
이 더 커서 일반 정렬을 사용하면 오류가 발생
뒤에 0 이 붙는 30, 300 같은 수들이 문제이기 때문에 0 을 제외한 값과 0의 개수를 기록해서 나중에 문자열을 만들 때 0 이 많을 수록 나중에 합치는 것으로 풀이
시간초과 발생
커스텀 정렬하기 - 두 값을 연결했을 때 더 큰 값을 먼저 출력
bool cmp(string a, string b) {
return a+b>b+a;
}
예를 들어 1과 2를 비교한다면 12보다 21이 더 크기 때문에 2 다음에 1이 출력하게 되는 것
❗️ 실제 return 값으로 a+b
가 출력되는 것이 아니라 더 큰 조합으로 출력 순서를 정하는 방식
❗️ 주어진 숫자가 오직 0 밖에 없는 경우 예외처리 필요
첫 자리가 같을 경우, 0이 붙는 값들을 처리하기 위해 정렬을 커스터마이징하는 것이 관건이었음
파라미터를 연산한 값에 따른 정렬은 시도해보지 못했는데 다른 문제에서도 응용해볼 수 있을 것 같음
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(string a, string b) {
return a+b>b+a;
}
string solution(vector<int> numbers) {
string answer = "";
vector<string> v;
for(int i=0;i<numbers.size();i++) {
v.push_back(to_string(numbers[i]));
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++) {
answer+=v[i];
}
if(v[0]=="0") answer="0";
return answer;
}