공부/코딩테스트
[프로그래머스] 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보다 너무나도 큰 수가 되어버려 오류가 난다.