[프로그래머스] 하노이의 탑 (JAVA)

유존돌돌이·2022년 1월 21일
0

Programmers

목록 보기
152/167
post-thumbnail

문제 설명

하노이 탑(Tower of Hanoi)은 퍼즐의 일종입니다. 세 개의 기둥과 이 기동에 꽂을 수 있는 크기가 다양한 원판들이 있고, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있습니다. 게임의 목적은 다음 두 가지 조건을 만족시키면서, 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓는 것입니다.

한 번에 하나의 원판만 옮길 수 있습니다.
큰 원판이 작은 원판 위에 있어서는 안됩니다.
하노이 탑의 세 개의 기둥을 왼쪽 부터 1번, 2번, 3번이라고 하겠습니다. 1번에는 n개의 원판이 있고 이 n개의 원판을 3번 원판으로 최소 횟수로 옮기려고 합니다.

1번 기둥에 있는 원판의 개수 n이 매개변수로 주어질 때, n개의 원판을 3번 원판으로 최소로 옮기는 방법을 return하는 solution를 완성해주세요.

제한사항

n은 15이하의 자연수 입니다.

Code

import java.util.*;
class Solution {
    List<List<Integer>> move;
    public int[][] solution(int n) {
        move = new ArrayList<>();
        hanoi(n, 1, 2, 3);
        int[][] ret = new int[move.size()][2];
        for(int i=0 ; i<move.size() ; i++) {
            ret[i][0] = move.get(i).get(0);
            ret[i][1] = move.get(i).get(1);
        }
        return ret;
    }
    public void hanoi(int n, int start, int via, int end) {
        if(n==1) {
            move(start, end);
        } else {
            hanoi(n-1, start, end, via);
            move(start, end);
            hanoi(n-1, via, start, end);
        }
        return;
    }
    public void move(int start, int end) {
        List<Integer> list = new ArrayList<>();
        list.add(start);
        list.add(end);
        move.add(list);
        return;
    }
}

Comment

하노이의 탑은 재귀함수를 써서 풀었다.
규칙은

  • 제일 밑에 있는 것을 목표 장소에 옮기려면 일단 모두 현재위치, 목표위치 말고 다른 곳에 모두 옮긴다.
hanoi(n-1, start, end, via);
  • 그 후 제일 마지막(제일 큰)것을 목표 위치에 옮긴다.
move(start, end);
  • 그리고 다른곳에 옮긴 다른것을 목표 위치로 옮기는데, 현재 위치는 경유지, 목표지는 목표지, 경유지는 처음 출발지이다.
hanoi(n-1, via, start, end);
  • 마지막인 경우는 출발지에서 도착지로 세팅한다.
move(start, end);

0개의 댓글