STUDY/코딩테스트 연습(PS)

프로그래머스/가장 큰 수(정렬)/C++

hyunah 2021. 4. 7. 12:49

문제 설명

정수로 주어진 numbers를 string으로 변환하여 정렬하거나 각 숫자의 자리수별로 비교하여 처리해주면 된다.

나는 전자의 방법을 썼다. 

 

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

using namespace std;

bool compare(string x, string y){
    return x+y > y+x;
}

string solution(vector<int> numbers) {
    vector<string> numbers_str;
    string answer = "";

    for(int i = 0; i<numbers.size(); i++){
        numbers_str.push_back(to_string(numbers[i]));
    }

    sort(numbers_str.begin(), numbers_str.end(), compare);

    if(numbers_str[0].compare("0") == 0) return "0";

    for(int i = 0; i<numbers.size(); i++){
        answer+= numbers_str[i];
    }

    return answer;
}

 

 

디버깅 기록

: compare 함수를 작성하는 데에 참 많은 애를 먹었다. string으로 변환해서 정렬하려고 한 번 마음 먹으니까 뜯어 고치고 싶지는 않고.. 어떻게 잘 생각해보면 모든 케이스를 한 번에 처리할 방법이 반드시 있을텐데 도저히 모르겠어서 자리수에 따라, 0인 경우에 따라 등등 다양한 경우로 쪼개고 쪼개다가 이렇게는 안 된다는 걸 깨달았다.

결국에는 여러 스트링을 이어서 가장 큰 수가 되도록 만들 거니까, 두 개를 이어본 다음 더 큰 결과가 만들어지는 쪽을 택하면 된다. 작지만 명확한 규칙을 찾으면 풀리는 문제.