PS/브루트포스 알고리즘[Bruteforce]

백준 16943 숫자 재배치(c++)

SeungbeomKim 2023. 1. 24. 16:38

https://www.acmicpc.net/problem/16943

 

16943번: 숫자 재배치

두 정수 A와 B가 있을 때, A에 포함된 숫자의 순서를 섞어서 새로운 수 C를 만들려고 한다. 즉, C는 A의 순열 중 하나가 되어야 한다.  가능한 C 중에서 B보다 작으면서, 가장 큰 값을 구해보자. C는 0

www.acmicpc.net

이 문제는 c++에 내장되어 있는 next_permutation을 사용하면 간단하게 풀 수 있는 문제입니다. A, B를 입력받고, A의 순서를 뒤바꿔서 C보다 작은 최대 수를 구하는 문제입니다. 우선적으로 A를 문자열로 입력받습니다. 그리고 next_permutation을 이용하여 순열을 하나씩 구하고 stoi함수를 통해 숫자로 파싱 시켜주고 B와 비교해서 작으면 값을 지속적으로 갱신해주는 방식으로 풀 수 있습니다.

 

<코드>

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    string input_num;
    int max_num;
    cin >> input_num >> max_num;
    int ans = -1;
    sort(input_num.begin(), input_num.end());

    do
    {
        int c = stoi(input_num);
        if (input_num[0] != '0' && c < max_num)
        {
            if (ans == -1 || ans < c)
            {
                ans = c;
            }
        }
    } while (next_permutation(input_num.begin(), input_num.end()));

    cout << ans << '\n';
}