728x90
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
어떻게 풀 지 고민한 문제이다.
string으로 변환한 후에 cmp 함수를 어떻게 작성하나 고민했고, 0번째 글자부터 3번째 글까지 하나씩 비교하는 방식을 했었는데 제대로 되지 않았다.
정답 코드를 보니 너무 간단했고, 이런 생각은 어떻게 하는건가 싶다.
하나 알게된 점은 compare 함수에서 계속 core dumped 에러가 났는데, 컴파일러 버전에 따라 비교로 들어온 두 인자가 같은 경우 true 를 반환하면 오류가 난다고 한다. 그래서 내 visual studio는 괜찮았는데, 채점 서버에서는 오류가 떴던 것이다.
C++ 코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
vector<string> str;
bool cmp(string a, string b) {
if (a + b <= b + a)
return false;
return true;
}
string solution(vector<int> numbers) {
string answer = "";
//int를 모두 string으로
for (int i = 0; i < numbers.size(); i++)
str.push_back(to_string(numbers[i]));
//cmp에 따라 정렬
sort(str.begin(), str.end(), cmp);
//정렬된 수를 모두 answer에 합한다.
for (int i = 0; i < str.size(); i++)
answer += str[i];
//입력으로 들어온 수가 모두 0인 경우
if (answer[0] =='0') return "0";
return answer;
}
int main()
{
cout << solution({ 30,3,300 });
cout << solution({ 0,0,0,0 });
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 조이스틱 (0) | 2020.04.28 |
---|---|
[프로그래머스] 큰 수 만들기 (0) | 2020.04.28 |
[프로그래머스] 가장 먼 노드 (0) | 2020.03.28 |
[프로그래머스] 예산 (0) | 2020.03.27 |
[프로그래머스] 타일 장식물 (0) | 2020.03.27 |