[프로그래머스] 하노이의 탑::알고리즘

2020. 7. 6. 13:47algorithm/recursion

문제 출처 : Programmers(https://programmers.co.kr/learn/courses/30/lessons/12946)

 

 

 하노이의 탑(Tower of Hanoi)은 퍼즐의 일종입니다.

 

 세 개의 기둥과 이 기둥에 꽂을 수 있는 크기가 다양한 원판들이 있고, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있습니다.

 

 게임의 목적은 두 가지 조건을 만족시키면서 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓는 것입니다.

 

1) 한 번에 하나의 원판을 옮길 수 있습니다.

2) 큰 원판이 작은 원판 위에 있어서는 안됩니다.

 

 하노이의 탑 문제는 재귀 호출을 이용해 풀 수 있는 가장 유명한 예제 중 하나입니다.

 

< 애니메이션 : 하노이의 탑의 원리 >

 

출처

 위키백과(https://ko.wikipedia.org/wiki/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98_%ED%83%91)

 

 

Java 코드

 

package skill.check.test.level3;

import java.util.Arrays;

public class Solution_하노이의탑 {

	public static int[][] answer;
	public static int idx;
	
	public static void move(int n, int from, int via, int to) {
		if (n == 0)
			return;
		
		move(n - 1, from, to, via);
		answer[idx][0] = from;
		answer[idx++][1] = to;
		move(n - 1, via, from, to);
	}
	
	public static int[][] solution(int n) {
		answer = new int[(int) Math.pow(2, n) - 1][2];
		idx = 0;
		move(n, 1, 2, 3);
		return answer;
	}
	
	public static void main(String[] args) {
		for (int i = 0; i < 3; ++i)
			System.out.print(Arrays.toString(solution(2)[i]) + " ");
		System.out.println();
	}

}