본문 바로가기

Problem Solving/프로그래머스

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


#include <string>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <iostream>
using namespace std;

bool compare(const string &a, const string &b) {
    return a + b > b + a;
}

string solution(vector<int> numbers) {
    vector<string> arr;
    string answer;
    
    for(int it : numbers)
        arr.push_back(to_string(it));
    
    sort(arr.begin(), arr.end(), compare);
    
    for(string sit : arr)
        answer += sit;
    
    return answer.substr(0,2) == "00" ? "0" : answer;
}

주어진 숫자를 sorting해서 가장 큰 숫자를 만드는 문제이다.

단순히 앞자리가 큰 숫자가 맨 앞으로 오도록 sorting하면 되겠다고 생각해서 compare함수를 구현했다.

처음에는 문자열 2개를 비교하며 만약 string a가 string b보다 짧다면 string a의 끝나는 숫자가 b의 남은 숫자보다 큰지를 비교하며 나아가려고 했다(ex: 3, 32이면 332가 323보다 크므로 3과 2를 비교하고 리턴하는 것이다.)

 

그런데 생각해보니 결국 더한 값이 뭐가 더 큰지를 비교하는 것이라는 것을 알고 코드를 밀어버리고 두 문자열을 붙인 순서가 더 큰 값을 true로 가져오도록 compare함수를 수정했다.

 

그리고 있어보이려고(leetcode에서는 생성자가 속도가 더 빨라서 프로그래머스도 그럴까? 싶어서 적용해보았다) for iterator를 사용하였다.

 

그 후 testcase 11번이 자꾸 틀려서 곰곰히 생각해보니 00일 때 0이 아닌 00을 return해서 문제가 생기는 것 같아 수정하였더니 모든 테스트 케이스도 통과하였다.


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

 

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

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

programmers.co.kr