[c++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค :: ๊ฐ€์žฅ ํฐ ์ˆ˜ (๋ฌธ์ œ ํ’€์ด, ์ฝ”๋“œ)

๊ฐ€์žฅ ํฐ ์ˆ˜

๋ฌธ์ œ

๋ฌธ์ œ ์„ค๋ช…

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

 


์ฝ”๋“œ

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

using namespace std;

void swap(vector<int>& arr, int idx1, int idx2) {
    int tmp = arr[idx1];
    arr[idx1] = arr[idx2];
    arr[idx2] = tmp;
}

bool compareModule(int a, int b){
    int num1 = stoi(to_string(a).append(to_string(b)));
    int num2 = stoi(to_string(b).append(to_string(a)));

    if(num1>num2)
        return true; // ํ˜„์žฌ ์ˆœ์„œ๊ฐ€ ๋งž์Œ
    else
        return false; // ํ˜„์žฌ ์ˆœ์„œ๊ฐ€ ํ‹€๋ฆผ

}

void quickSortModule(vector<int>& arr, int left, int right) {
    // quickSort๋กœ ์‹œ๊ฐ„๋ณต์žก๋„ ์ค„์ด๊ธฐ
    if (right - left <= 1)
        return;

    int pivot = arr[left];
    int high = left+1;
    int low = right-1;
    while (1) { // n => 10^5
        while(high<right){
            if (compareModule(pivot, arr[high])) //10^3
                break;
            else
                high++;
        }
        while(low>left){
            if (compareModule(arr[low], pivot))
                break;
            else
                low--;
        }
        if (high >= low)
            break;
        swap(arr, high, low);
    }
    swap(arr, left, low);
    quickSortModule(arr, left, low);
    quickSortModule(arr, low + 1, right);
}

string solution(vector<int> numbers) {
    string answer = "";

    quickSortModule(numbers, 0, numbers.size()); //nlgn

    int flag = 0; // ์•ž์˜ 0 ์ง€์›Œ์ฃผ๊ธฐ
    for(int i=0; i<numbers.size(); i++){
        if(flag==0 && numbers[i]==0)
            continue;
        else
            flag=1;
        answer+=to_string(numbers[i]);
    }
    if(answer=="") // ๋‹ต์ด 0์ผ ๊ฒฝ์šฐ
        answer="0";

    return answer;
}

 

ํ’€์ด

 ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ํ€ต ์ •๋ ฌ๋กœ ์ •๋ ฌํ•˜๋˜, ๋น„๊ต๋ฅผ ๋‹จ์ˆœํžˆ ์ˆ˜์˜ ๋Œ€์†Œ๋กœ ํ•˜์ง€ ์•Š๊ณ  ๋”ฐ๋กœ ๋น„๊ต ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ๋‹ค. ๋น„๊ต ๋ชจ๋“ˆ์€ ๋‘ ์ˆ˜๋ฅผ ์ด์–ด๋ถ™์˜€์„ ๋•Œ, ๋” ํฐ ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋„๋ก ๋‘ ์ˆ˜์˜ ํ˜„์žฌ ์ƒ๋Œ€์  ์œ„์น˜๊ฐ€ ๋ฐ”๋ฅธ ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

 ์˜ˆ๋ฅผ ๋“ค์–ด 3๊ณผ 30์ด ์žˆ์„ ๋•Œ, ๊ทธ๋Œ€๋กœ ์ด์–ด๋ถ™์ด๋ฉด 330์ด๊ณ  30์„ ์•ž์œผ๋กœ ํ•ด์„œ ์ด์–ด๋ถ™์ด๋ฉด 303์ด๋‹ค. 330>303 ์ด๋ฏ€๋กœ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๋‹ค. ๋”ฐ๋ผ์„œ true ๋ฐ˜ํ™˜ํ•˜๋Š” ์‹์ด๋‹ค.

 

 quickSort๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ์ฒ˜์Œ์— ์‚ฝ์ž… ์ •๋ ฌ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค๊ฐ€ n^2์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  n์ด 10^5์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œฐ ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

void insertionSort(vector<int>& arr){
    // ์‚ฝ์ž… ์ •๋ ฌ
    for(int i=1; i<arr.size(); i++){
        int pos=i;
        while(pos>0){
            if(compareModule(arr[pos-1],arr[i]))
                break;
            --pos;
        }
        int tmp = arr[i];
        arr.erase(arr.begin()+i); // ๊ธฐ์กด ์š”์†Œ ์ง€์šฐ๊ธฐ
        arr.insert(arr.begin()+pos, tmp); // ์ ์ ˆํ•œ ์œ„์น˜์— ๋ผ์›Œ๋„ฃ๊ธฐ
    }
}

 

 ์ค‘๊ฐ„์— ๋‘ ์ˆ˜๋ฅผ ์ด์–ด๋ถ™์ด๋Š” ๊ณผ์ •์„ ์–ด๋ ต๊ฒŒ ํ•ด์„ํ•ด์„œ ๋‘ ์ˆ˜์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ ๋งž์ถฐ์ค€ ์ˆ˜ ์ž‘์€ ์ˆ˜์— ํฐ ์ˆ˜์˜ ์•ž์ž๋ฆฌ๋ฅผ ๋ถ™์ด๋Š” ์‹์œผ๋กœ ํ•ด์„œ ๋น„๊ตํ•ด๋ณด๊ธฐ๋„ ํ•˜๊ณ ,

bool compareModule(int a, int b){
    if(a<b)
        return !compareModule(b,a);

    int sub = returnLength(a)-returnLength(b); // ์ž๋ฆฟ์ˆ˜ ์ฐจ์ด
    for(int i=0; i<sub; i++){
        b*=10;
    }
    b+=((int)(a/pow(10,returnLength(a)-sub))); // b์˜ ์•ž์ž๋ฆฌ ๋’ค์— ๋ถ™์—ฌ์ฃผ๊ธฐ

    if(a<=b)
        return false;
    else
        return true;
}

 

ex_) 4, 495 => 400 + 49(495์˜ ์•ž์ž๋ฆฌ) , 495 => 449 , 495 ๋น„๊ต

 

 ๋‘ ์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ์ด์–ด๋ถ™์ด๋Š”๋ฐ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์œ„์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋น„๊ตํ•ด๋ณด๊ธฐ๋„ ํ•˜๊ณ ,

bool compareModule(int a, int b){
    int a_len = returnLength(a);
    int b_len = returnLength(b);

    int num1 = (a*pow(10,b_len))+b;
    int num2 = (b*pow(10,a_len))+a;

    if(num1>num2)
        return true; // ํ˜„์žฌ ์ˆœ์„œ๊ฐ€ ๋งž์Œ
    else
        return false; // ํ˜„์žฌ ์ˆœ์„œ๊ฐ€ ํ‹€๋ฆผ

}

ex_) 4, 495 => 4000 + 495, 4950 + 4

 

๊ฒฐ๊ตญ to_string (int => string) ๊ณผ stoi (string => int)๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์จ์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

์ฑ„์  ๊ฒฐ๊ณผ

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

bool compare(const string &a, const string &b)
{
    if (b + a < a + b)
        return true;
    return false;
}

string solution(vector<int> numbers) {
    string answer = "";

    vector<string> strings;

    for (int i : numbers)
        strings.push_back(to_string(i));

    sort(strings.begin(), strings.end(), compare);

    for (auto iter = strings.begin(); iter < strings.end(); ++iter)
        answer += *iter;

    if (answer[0] == '0')
        answer = "0";

    return answer;
}

์ˆ์ฝ”๋”ฉ ๋งŒ์„ธ...!

  • sort๋Š” ๋น„๊ต ํ•จ์ˆ˜๋ฅผ ์ค˜์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • compare ํ•จ์ˆ˜๋Š” ์ž๋™ ํ˜•๋ณ€ํ™˜์„ ์ด์šฉํ•ด์„œ ์ €๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 0์ฒ˜๋ฆฌ๋„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค => ์•ž์ž๋ฆฌ๊ฐ€ 0์ด๋ฉด ๋’ท์ž๋ฆฌ๋“ค์€ ๋ชจ๋‘ 0์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ
๋ฐ˜์‘ํ˜•