
문제 해석을 잘못해서 조금 헤맸던 문제
Shake()함수에서 카드를 섞도록 한다.tmp[S[i]] = arr[i];answer++Check()P[arr[i]] != i%3 일 경우는 제대로 주어지지 않는다는 뜻이므로 false 리턴Check()가 true 될 때까지 Shake() 하는데,arr)가 또 나올 경우, 계속 해도 원하는 카드의 순서가 안나온다는 의미set으로 한다.set에 있으면 -1 리턴, 없으면 set에 insert#include <iostream>
#include <vector>
#include <set>
using namespace std;
int n;
vector<int> P;
vector<int> S;
vector<int> arr;
int answer = 0;
set<vector<int>> order;
bool Check()
{
for (int i = 0; i < n; i++)
{
if (P[arr[i]] != i%3) return false;
}
return true;
}
void Shake()
{
if (Check())
{
cout << answer << endl;
return;
}
vector<int> tmp(n);
for (int i = 0; i < n; i++) // 섞기
{
tmp[S[i]] = arr[i];
}
arr = tmp;
if (order.find(arr) != order.end()) // 이미 검사한 카드 순서라면
{
cout << -1 << endl;
return;
}
order.insert(arr);
answer++;
Shake();
}
int main(void)
{
cin >> n;
P.resize(n);
S.resize(n);
for (int i = 0; i < n; i++)
{
cin >> P[i];
}
for (int i = 0; i < n; i++)
{
cin >> S[i];
}
arr.resize(n);
for (int i = 0; i < n; i++)
{
arr[i] = i;
}
Shake();
return 0;
}