import java.util.Scanner;
public class B11729 {
public static StringBuilder sb = new StringBuilder();
//StringBuilder?
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
//원판 이동 회수 구하기기
sb.append((int) (Math.pow(2,num) - 1)).append('\n');
Hanoi(num, 1, 2, 3);
System.out.println(sb);
}
public static void Hanoi(int num, int start, int mid, int to) {
//원판의 개수가 1개라면, 시작점과 도착점만 구함
if (num ==1) {
sb.append(start + " " + to + "\n");
return;
}
//num-1개의 원판을 중간지점으로 옮김
Hanoi(num -1, start, to, mid);
//시작점의 원판 1개를 도착점으로 옮김
sb.append(start + " " + to + "\n");
//n-1개의 중간점에서 도착점으로 옮김
Hanoi(num -1, mid, start, to);
}
}
Math.pow(대상숫자,지수): 모두 double형
append() 메소드 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가 -> 이어 붙이는 것
StringBuilder String과 문자열을 더할 때 새로운 객체를 생성하는 것이 아니라 기존의 데이터에 더하는 방식을 사용하기 때문에 속도도 빠르며 상대적으로 부하가 적음
PREVIOUS[JAVA] 10870 (피보나치 수열)
NEXTStack & Queue 구현