[프로그래머스] 가장 큰 수
문제 내용
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers | return |
[6, 10, 2] | "6210" |
[3, 30, 34, 5, 9] | "9534330" |
나의 생각
1. 어떻게 풀까?
그리디 알고리즘을 사용합니다.
여기서 잠깐!! 그리디 알고리즘이란?
욕심쟁이 알고리즘으로 제일 큰 것부터 우선으로 택하는 알고리즘을 말합니다.
2. 그리디 알고리즘이 잘 작동할 것인가?
그냥 큰 수 순서대로 정렬을 숫자를 만들게 될 시 제대로 된 답이 나오지 않습니다.
위의 케이스를 예를 들어 6, 10이라는 숫자를 큰 순서대로 놓을 시 106(10, 6)이라는 숫자가 됩니다.
하지만 610(6, 10)이라는 순서가 더 큰 숫자이지요.
그러므로 저희는 두 문자열을 순서대로 합친 것과, 반대로 합친 것 중에 큰 수를 택해주면 되는 것입니다.
bool compare_big_number(int a, int b){
const string A = to_string(a);
const string B = to_string(b);
// 순서대로 합 친 수와 반대로 합 친 수 비교
return A + B > B + A;
}
위 함수를 sort() 함수와 같이 사용하면 위 함수의 결과를 토대로 정렬이 완성됩니다.
string solution(vector<int> numbers){
...
sort(numbers.begin(), numbers.end(), compare_big_number);
...
}
3. 예외는 존재하지 않을까?
이제 정렬도 되었으니 순서대로 이어 붙이면 가장 큰 수가 완성이 됩니다.
하지만 예외가 존재합니다.
만약에 {0, 0, 0} 테스트 케이스가 온다면 결괏값은 000이라는 값이 출력될 것입니다.
그러므로 아래 식을 통하여 예외를 처리해줍니다.
string solution(vector<int> numbers){
...
// 만약 처음 숫자가 0 일 경우
if(numbers.at(0) == 0) return "0";
...
}
(0이 제일 처음 나오면서 큰 수 일 경우는 0으로만 이루어진 테스트 케이스 바께 없습니다.)
전체 코드
bool compare_sum_number(int a, int b){
const string A = to_string(a);
const string B = to_string(b);
return A + B > B + A;
}
string solution(vector<int> numbers) {
string answer = "";
sort(numbers.begin(), numbers.end(), compare_sum_number);
if(numbers.at(0) == 0) return "0";
for(auto number : numbers)
answer += to_string(number);
return answer;
}
테스트 코드 (필요하신 분만)
int main(){int main(){
const vector<vector<int>> numbers_testcases = {
{6, 10, 2},
{3, 30, 34, 5, 9},
{0, 0}
};
for(auto numbers : numbers_testcases){
const string ret = solution(numbers);
cout << ret << endl;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 위장 (0) | 2020.11.02 |
---|---|
[heap] 힙 이란? (feat.cpp) (0) | 2020.11.01 |
[프로그래머스] 괄호 변환 (0) | 2020.10.29 |
[프로그래머스] 소수 찾기 (0) | 2020.10.28 |
에라토스테네스의 체란? (feat.cpp 구현) (0) | 2020.10.28 |