TOP

with code & food

 

문제 내용

문제 설명

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