이상한 하노이 탑

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

요약
세 개의 막대에서 임의 반지름의 원판을 정해진 규칙에 따라 옮기며 그 이동 순서를 출력하는 시뮬레이션 문제이다.
난이도

보통10점 중 4점

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

문제

장대가 세 개 있고, 첫 번째 장대에 원판 NN개가 쌓여 있다. 원판은 한 번에 한 개씩만 옮긴다. 한 번의 이동은 어떤 장대의 맨 위 원판을 다른 장대의 맨 위에 올려놓는 것이다.

승민이는 고전 하노이 탑 문제를 두 군데 바꿔서 이상한 하노이 탑 문제를 만들었다. 첫째, "쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다(중간 과정 역시 그래야 한다)"라는 조건을 없앴다. 옮기는 도중에는 반경이 큰 원판을 작은 원판 위에 올려도 된다. 둘째, 첫 번째 장대의 원판이 반경과 상관없이 아무 순서로나 놓여 있다.

목표는 원판 NN개를 모두 세 번째 장대로 옮기는 것이다. 마지막 상태에서 세 번째 장대의 반경은 아래에서 위로 가면서 커지지 않아야 한다. 즉 자기보다 반경이 작은 원판 위에 놓인 원판이 하나도 없어야 한다.

승민이는 이 문제를 진수에게 주면서 원판을 옮긴 횟수가 12345 이하이면 피자를 사주기로 했다. 진수가 피자를 먹도록 도와주자.

입력

첫째 줄에 원판의 개수 NN (1≤N≤1231 \le N \le 123)이 주어진다.

둘째 줄에 첫 번째 장대에 쌓인 원판의 반경 a1,a2,…,aNa_1, a_2, \dots, a_N (1≤ai≤N1 \le a_i \le N)이 공백을 두고 주어진다. 제일 아래에 있는 원판의 반경부터 차례로 주어진다. 반경이 같은 원판이 여러 개 있을 수 있다.

출력

답이 여러 가지인 문제이므로, 다음 절차가 만들어내는 이동 순서를 그대로 출력한다. 첫 번째 장대나 두 번째 장대에 원판이 하나라도 남아 있는 동안 아래 네 단계를 반복한다.

  1. 첫 번째 장대와 두 번째 장대에 남아 있는 원판의 반경 중 가장 큰 값을 MM이라 하자.
  2. i=1,2i = 1, 2에 대해, ii번째 장대에서 반경이 MM인 원판 중 가장 위에 있는 원판보다 위에 쌓여 있는 원판의 개수를 did_i라 하자. ii번째 장대에 반경이 MM인 원판이 없으면 di=∞d_i = \infty로 둔다.
  3. d1≤d2d_1 \le d_2이면 X=1X = 1, Y=2Y = 2로 두고, 아니면 X=2X = 2, Y=1Y = 1로 둔다.
  4. XX번째 장대의 맨 위 원판의 반경이 MM이면 그 원판을 세 번째 장대로 옮기고, 아니면 XX번째 장대의 맨 위 원판을 YY번째 장대로 옮긴다.

첫째 줄에 이 절차가 수행한 이동 횟수 KK를 출력한다. 다음 KK개 줄에 이동을 순서대로 A B (1≤A,B≤31 \le A, B \le 3) 형식으로 출력한다. AA번째 장대 맨 위에 있는 원판 하나를 BB번째 장대 맨 위로 옮긴다는 뜻이다. 이 절차는 항상 N(N+1)2≤7626\frac{N(N+1)}{2} \le 7626번 이내에 끝나므로 K≤12345K \le 12345가 언제나 성립한다.

힌트

아래 그림은 예제를 푸는 과정이다.

예제1

  1. 예제 1

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