https://www.acmicpc.net/problem/15501
순열을 뒤집는 연산을 , 왼쪽으로 미는 연산을 , 오른쪽으로 미는 연산을 이라 하자.
순서대로 연산들을 적용하는 것을 기호를 오른쪽으로 연이어 표시하자. 예를 들어 은 순열을 뒤집은 후 왼쪽으로 밀었음을 나타낸다.
이제 , , 사이에서 자명하게 성립하는 법칙들을 확인해보자.
위의 법칙들을 통해 서로 다른 연산들의 조합은 다음 개의 조합 밖에 없음을 알 수 있다.
그러므로, 알고리즘은 다음과 같이 생각해볼 수 있다.
순열을 왼쪽으로 밀고, 같은지 확인하는 과정을 번 반복한 후, 같지 않았다면 뒤집어서 번 더 시행해본다. 그래도 같지 않으면 두 순열을 같게 만들 수 없는 것.
from collections import deque
n = int(input())
p = deque(map(int, input().split()))
q = deque(map(int, input().split()))
for _ in range(n):
q.rotate(-1)
if p == q:
print("good puzzle")
exit(0)
r = deque([*q][::-1])
for _ in range(n):
r.rotate(-1)
if p == r:
print("good puzzle")
exit(0)
print("good puzzle" if p == q else "bad puzzle")