문제 해석을 잘못해서 조금 헤맸던 문제
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;
}