[ 문제 ] : https://programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr


[ 문제 접근 ]

 

결과적으로 풀지 못해서 구글에 정답 코드를 찾아 보았다.

 

문자열 정렬, sort 함수 custom 까지는 잘 왔으나, bool cmp() 함수 만들때 case를 적절히 나눠서 정렬 기준을 세워주지 못했다.


[ 최종 코드 ]

 

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

using namespace std;

bool cmp(string& a,string& b){
    if(a.length() == b.length()){
        return a>b;
    }else {
        return a+b > b+a;
    }
}

string solution(vector<int> numbers) {
    string answer = "";
    vector<string> temp;
    for(auto& elem:numbers) temp.push_back(to_string(elem));
    
    std::sort(temp.begin(),temp.end(),cmp);
    if(temp[0]=="0"){
        return "0";
    }
    for(auto& elem:temp) answer +=elem;
    
    return answer;
}

 

 

 


[ Key Point ]

 

👉 숫자의 글자수가 같으면 사전순대로 나열하고, 다르면 ? ( 난 ? 부분을 해결하지 못했다.)

 

다르면 두 수를 합쳐봐서 큰 수가 앞에 오게 해야한다. 

 

bool cmp(string& a,string& b){
    if(a.length() == b.length()){
        return a>b;
    }else { // 글자수가 다르면
        return a+b > b+a;
    }
}

 

👉 모든 수가 0 일때는 "0000..00" 이 아니라 0을 리턴해야 된다.

 


[ 다른 사람 풀이 ]

 

ref :: https://mungto.tistory.com/22

 

+ Recent posts