문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 return

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이법

algorithm 헤더에 있는 sort 함수를 커스텀하면 된다

 

sort에 들어가는 cmp 함수에서 잘 비교하면되는데, 처음에는 string 끼리 비교가 되는지 모르고 무조건 int형으로 받아서 비교하려고 했었다

그러다보니 생긴 문제점이 3과 400을 비교할 때의 문제점이었는데, 계속해서 10을 나눠주면서 앞에 있는 수를 비교해주려고 하니 너무 복잡해졌다

하지만 여러 블로그들을 보면서 string 끼리 비교가 되는 데, 비교를 할 때 그냥 a와 b를 비교해버리면 3과 30이 나왔을 때, 330이 더 크지만 303으로 처리를 해버려서 틀리게 된다

따라서 비교 시, a와 b를 합쳐보면서 비교해야 한다

즉, 3과 30이 나왔을때 303이 큰지, 330이 큰지 비교한다는 뜻이다

 

마지막으로 numbers에 0만 있으면 0이 여러개 정렬되서 return 되므로 따로 처리를 해주어야 한다

  

 

 

소스 코드

#include <string>
#include <vector>
#include <algorithm>

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);
    
    if (v[0] == "0")
        return "0";
    
    for (int i = 0; i < numbers.size(); i++) {
        answer += v[i];
    }
    
    return answer;
    
}
복사했습니다!