Algorithm/프로그래머스

[프로그래머스/level2/c++] 가장 큰 수

호_두씨 2021. 1. 24. 22:53

문제 :

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

제한 사항 :

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예 :

numbers return
[6,10,2] "6210"
[3,30,34,5,9] "9534330"

 

코드 :

#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(const string &s1,const string &s2){
    return s1+s2>s2+s1;
}
string solution(vector<int> numbers) {
    string answer = "";
    vector<string> sorted;
    if(*max_element(numbers.begin(),numbers.end())==0)  return "0";
    for(int i=0;i<numbers.size();i++)
        sorted.push_back(to_string(numbers[i]));
    sort(sorted.begin(),sorted.end(),compare);
    for(int i=0;i<sorted.size();i++)
        answer+=sorted[i];
    return answer;
}

 

다시 한번 짚고 넘어가기 :

-테스트 케이스 [0,0,0,0]일 때 output이 0인 경우는 고려안해서 마지막 테스트 케이스를 실패하였다.

그래서 최댓값이 0이면 바로 "0"을 반환할 수 있도록 코드를 작성하였다.

 

-처음에 compare함수의 매개변수를 string s1으로 선언하였는데 const string &s1로 넘겨주면 copy construct 하지 않아서 메모리 효율적이기 때문에 수정했다.