Programming/BOJ

[백준/BOJ] 2529 부등호

he1fire 2020. 11. 19. 02:31
728x90

문제 : 2529 부등호

 

2529번: 부등호

여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력

www.acmicpc.net

부등호 기호가 나열되어있는 배열이 주어질 때,

서로 다른 한 자릿수 숫자를 넣어 만족하는 가장 큰 수와

가장 작은 수를 찾아 출력하는 문제이다.

백트래킹 기법을 활용해서 모든 경우의 수를 확인해서 비교하면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
#define INF 1e15+7
using namespace std;
ll N, visited[10], mn=INF, mx=-1;
vector<char> arr;
void backtrack(ll now, ll depth){
    if (depth==N+1){
        mx=max(mx,now);
        mn=min(mn,now);
        return ;
    }
    for (int i=0;i<=9;i++){
        if (visited[i]==0){
            if (depth==0 || (arr[depth-1]=='>' && now%10>i) || (arr[depth-1]=='<' && now%10<i)){
                visited[i]=1;
                now=now*10+i;
                backtrack(now, depth+1);
                now/=10;
                visited[i]=0;
            }
        }
    }
}
int main(){
    cin >> N;
    for (int i=0;i<N;i++){
        char a;
        cin >> a;
        arr.push_back(a);
    }
    backtrack(0,0);
    cout << mx << "\n";
    if (pow(10,N)>mn)
        cout << "0";
    cout << mn;
    return 0;
}
728x90