아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

셔플

시간 제한2초메모리 제한256 MB

요약
1부터 n까지 정렬된 덱을 주어진 순열로 만드는 데 필요한 리플 셔플 최소 횟수를 구합니다.
난이도

보통10점 중 7점

유형
수학, 배열
정답자
아직 제출이 없습니다

문제

카드를 섞는 가장 흔한 방법은 리플 셔플 또는 도브테일 셔플이라고 부른다. 덱을 두 뭉치로 나눈 다음, 두 뭉치를 서로 끼워 넣어 하나로 합친다. 덱은 어느 위치에서든 나눌 수 있고, 두 뭉치는 어떤 방식으로든 끼워 넣을 수 있다. 끼워 넣을 때 각 뭉치 안의 카드 순서는 그대로 유지된다.

예를 들어 서로 다른 카드 10장으로 이루어진 덱이 다음과 같다고 하자.

1 2 3 4 5 6 7 8 9 10

여섯 번째 카드 뒤에서 나누면 두 뭉치는 다음과 같다.

1 2 3 4 5 6
7 8 9 10

이 둘을 끼워 넣으면 예를 들어 다음 순서가 나온다.

1 2 7 3 8 9 4 5 10 6

한 번 더 섞어 보자. 세 번째 카드 뒤에서 나누면 두 뭉치는 다음과 같다.

1 2 7
3 8 9 4 5 10 6

다시 끼워 넣으면 예를 들어 다음 순서가 나온다.

3 8 1 9 4 5 2 7 10 6

이것은 두 번 섞은 뒤에 나올 수 있는 순서 하나다. 서로 다른 카드 nn장이 1,2,3,…,n1, 2, 3, \dots, n 순서로 완벽하게 정렬된 상태에서 시작한다고 하자. 덱의 순서 하나가 주어졌을 때, 그 순서를 만들어 낼 수 있는 최소 셔플 횟수를 구하라.

입력

입력은 테스트 케이스 하나로 이루어진다. 프로그램은 서로 다른 입력으로 여러 번 실행될 수 있다. 첫 줄에 덱의 카드 수를 나타내는 정수 nn (1≤n≤1061 \le n \le 10^6)이 주어진다. 둘째 줄에는 덱의 순서를 나타내는 서로 다른 정수 cc (1≤c≤n1 \le c \le n) nn개가 공백 하나로 구분되어 주어진다. cc 값은 항상 11부터 nn까지의 순열이다.

출력

주어진 순서를 만들어 낼 수 있는 최소 셔플 횟수를 정수 하나로 한 줄에 출력한다. 공백은 출력하지 않는다.

예제3

  1. 예제 1

    입력
    10
    1 2 7 3 8 9 4 5 10 6
    
    예상 출력
    1
    
  2. 예제 2

    입력
    10
    3 8 1 9 4 5 2 7 10 6
    
    예상 출력
    2
    
  3. 예제 3

    입력
    8
    2 1 4 3 6 5 8 7
    
    예상 출력
    3