공부/코딩테스트

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

굥굔 2023. 3. 24. 21:13

[프로그래머스] 고득정 Kit 정렬 - 가장 큰 수

 

< 문제 >

 

< 풀이 >

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

using namespace std;

bool comp(string a, string b)
{
    int aNum = (int)(a[0]);
    int bNum = (int)(b[0]);

    if (aNum > bNum)
        return true;
    else if (aNum == bNum)
    {
        string AnB = a + b;
        string BnA = b + a;
        if (stoi(AnB) > stoi(BnA))
            return true;
        else
            return false;
    }
    else
        return false;
}

string solution(vector<int> numbers) {
    string answer = "";
    vector<string> str_num;
    int zeroCount = 0;
    for (int i = 0; i < numbers.size(); i++)
    {
        str_num.push_back(to_string(numbers[i]));
        if(numbers[i] == 0)
            zeroCount++;
    }

    if(zeroCount == numbers.size())
        return "0";
    
    sort(str_num.begin(), str_num.end(), comp);

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

 

< 해설 >

벡터의 sort 함수를 구현하는 문제이다.

테스트케이스도 엄청 좋은 예시를 넣어둬서 코드에서 실수한 부분을 바로 알 수 있다.

 

먼저 int를 string으로 바꾸고 sort를 했다. 어짜피 string의 1번째 숫자(char 이긴 하지만)만 필요로 하므로 string으로 변환 후 a[0] b[0] 요소를 가져와서 비교했다. 그런데 첫번째 숫자가 같을수 있다. 이 경우에는 a와 b를 연결한뒤

a+b 가 큰지 b+a 가 큰지 비교했다.

예시로 

a=30 / b=3 이면

a+b = 303

b+a = 330

이 된다. 이 경우에는 b+a가 크므로 false를 return 하는 것이다. (사실 모든 요소를 이렇게 비교해도 되지만 stoi 함수 호출을 줄이려고 해봤다 ㅋㅋ)

 

그런데 이렇게만 하면 정확성 테스트 11번이 오류가 난다!

나도 질문하기 란에 들어가서야 이유를 알 수 있었는데 만약 {0 , 0 , 0 , 0} 을 넣게되면 0 이 아닌 0000이 나오는 것이다...

이때는 0 만이 답이므로 vector<int>를 vector<string> 으로 바꾸는 과정에서 0인 수를 count 하고 count가 벡터의 사이즈와 동일하면 그냥 return "0"을 해줬다.

answer를 다 계산한 다음에 itos 하면 안되나요? 라고 할 수 있는데 그러면 프로그래머스에서는 core dump, 즉 int보다 너무나도 큰 수가 되어버려 오류가 난다.