큐 소트

시간 제한1초메모리 제한128 MB

요약
큐에 든 순열을 두 개의 보조 스택과 일괄 이동 연산만으로 오름차순으로 정렬할 때 필요한 최소 연산 수를 구한다.
난이도

어려움10점 중 8점

유형
BFS, 시뮬레이션, 구현, 완전 탐색
정답자
아직 제출이 없습니다

문제

큐 QQ와 두 개의 스택 AA, BB가 있고, 다음 7가지 연산을 사용할 수 있다.

  • QA(n): QQ에서 수를 하나 꺼내 AA에 넣는다. 이 동작을 nn번 반복한다.
  • QB(n): QQ에서 수를 하나 꺼내 BB에 넣는다. 이 동작을 nn번 반복한다.
  • QQ(n): QQ에서 수를 하나 꺼내 다시 QQ에 넣는다. 이 동작을 nn번 반복한다.
  • AQ(n): AA에서 수를 하나 꺼내 QQ에 넣는다. 이 동작을 nn번 반복한다.
  • BQ(n): BB에서 수를 하나 꺼내 QQ에 넣는다. 이 동작을 nn번 반복한다.
  • AB(n): AA에서 수를 하나 꺼내 BB에 넣는다. 이 동작을 nn번 반복한다.
  • BA(n): BB에서 수를 하나 꺼내 AA에 넣는다. 이 동작을 nn번 반복한다.

QQ는 큐(FIFO)이므로 수를 꺼낼 때는 항상 맨 앞에서 꺼내고 넣을 때는 항상 맨 뒤에 넣는다. AA와 BB는 스택(LIFO)이므로 꺼낼 때는 항상 맨 위에서 꺼내고 넣을 때는 맨 위에 쌓는다.

각 연산은 nn의 값과 관계없이 한 번으로 센다.

처음에 큐에는 수가 모두 채워져 있고 두 스택은 비어 있다. 큐에 들어 있는 수를 맨 앞에서 맨 뒤로 읽었을 때 오름차순이 되도록 만들려고 한다. 이때 필요한 연산 횟수의 최솟값을 구하여라. (정렬이 끝난 상태에서는 모든 수가 다시 큐 안에 있어야 하고 두 스택은 비어 있어야 한다.)

예를 들어 큐가 (4 3 1 2 0)이면 QA(2), QQ(2), AQ(2)의 순서로 3번 만에 정렬할 수 있고, 큐가 (5 4 1 3 2 0)이면 QB(2), QQ(1), QB(2), BQ(4)의 순서로 4번 만에 정렬할 수 있다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 한 줄로 주어지며, 그 줄의 첫 번째 정수는 큐에 들어 있는 수의 개수 NN이다. 이어서 큐의 맨 앞에서부터 순서대로 NN개의 수가 주어진다.

큐에 들어 있는 수는 모두 00 이상 N−1N-1 이하의 정수이고, 각 수는 정확히 한 번씩만 나타난다. NN은 1010을 넘지 않는다.

입력의 마지막 줄에는 00이 하나 주어지며, 이 줄은 처리하지 않고 입력의 끝을 뜻한다.

출력

각 테스트 케이스마다 큐를 오름차순으로 정렬하는 데 필요한 연산 횟수의 최솟값을 한 줄에 하나씩 출력한다.

예제3

  1. 예제 1

    입력
    5 4 3 1 2 0
    6 5 4 1 3 2 0
    0
    
    예상 출력
    3
    4
    
  2. 예제 2

    입력
    1 0
    2 0 1
    2 1 0
    0
    
    예상 출력
    0
    0
    1
    
  3. 예제 3

    입력
    5 0 1 2 3 4
    5 4 3 2 1 0
    0
    
    예상 출력
    0
    2