성우리뷰

C++ prev_permutation 통한 모든 조합 넣기

두원공대88학번뚜뚜 2021. 10. 27. 20:18
#include <string>
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>
#include <limits>
#include <limits>
#include <iterator>

using namespace std;

vector<int> permutation(string& str) {
    
    sort(str.begin(), str.end(), std::greater<>());
    vector<string> tmp;
    vector<int> tmpint;
    do {
        if(stoi(str) >= pow(10, str.size()-1))
            tmpint.push_back(stoi(str));
    } while (prev_permutation(str.begin(), str.end()));

    return tmpint;
}

vector<int> solve(long s1, long s2) {
    string str1 = to_string(s1);
    string str2 = to_string(s2);

    string ready1 = ""; string ready2 = "";

    for (int i = 0; i < str1.size(); i+=2) {
        for (int j = 0; j < str1[i + 1] - '0'; j++) {
            ready1 += str1[i];
        }
    }
    for (int i = 0; i < str2.size(); i+=2) {
        for (int j = 0; j < str2[i + 1] - '0'; j++) {
            ready2 += str2[i];
        }
    }
    string len = "len";
    vector<int> permut1 = permutation(ready1);
    vector<int> permut2 = permutation(ready2);

    int min = 2100000000; int max=2100000000;
    int tmpmin; int tmpmax;
    for (auto a: permut1) {
        for (auto b : permut2) {
            if (abs(a - b) == 1) {
                tmpmin = a > b ? b : a;
                tmpmax = a > b ? a : b;

                if (min > tmpmin) {
                    min = tmpmin;
                    max = tmpmax;
                }
            }
        }
    }
    cout << min << " " << max << endl;

    vector<int> ans;
    return ans;
}

int main(void){

    vector<int> ans = solve(1103, 1202);
    ans = solve(21, 31);
    solve(92817101, 81711102);

       return 0;
 }

주목할 부분은

do {
        if(stoi(str) >= pow(10, str.size()-1))
            tmpint.push_back(stoi(str));
    } while (prev_permutation(str.begin(), str.end()));