1일1알

백준 9011번 순서 C++ 본문

알고리즘

백준 9011번 순서 C++

영춘권의달인 2022. 11. 20. 13:01

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

 

9011번: 순서

n개의 정수로 된 순서 S= (s1, s2, ..., sn)가 있다. 여기서 si ≠ sj이고, 1 ≤ si ≤ n이다. S로부터 새로운 순서 R = (r1, r2, ..., rn)을 얻을 수 있는데, 여기서 ri는 S의 부분 순서 {s1, s2, ..., si-2, si-1} 중에서

www.acmicpc.net

 

역순으로 확인

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

vector<int> v;
vector<int> nums;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        v = vector<int>(n);
        nums = vector<int>(n);
        for (int i = 0; i < n; i++) v[i] = i + 1;
        for (int i = 0; i < n; i++) {
            int r;
            cin >> r;
            nums[i] = r;
        }
        vector<int> ans;
        bool isAns = true;
        for (int i = n - 1; i >= 0; i--) {
            int idx = nums[i];
            if (idx >= v.size()) {
                isAns = false;
                break;
            }
            int val = v[idx];
            v.erase(v.begin() + idx);
            ans.push_back(val);
        }
        if (isAns == false) {
            cout << "IMPOSSIBLE\n";
        }
        else {
            for (int i = n - 1; i >= 0; i--) {
                cout << ans[i] << " ";
            }
            cout << "\n";
        }
    }
}