본문 바로가기
개발/알고리즘

[프로그래머스][LEVEL3] 하노이의 탑

by ISA(류) 2021. 11. 25.

# 문제 원문

 

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

  1. 한 번에 하나의 원판만 옮길 수 있습니다.
  2. 큰 원판이 작은 원판 위에 있어서는 안됩니다.

하노이 탑의 세 개의 기둥을 왼쪽 부터 1번, 2번, 3번이라고 하겠습니다. 1번에는 n개의 원판이 있고 이 n개의 원판을 3번 원판으로 최소 횟수로 옮기려고 합니다.

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

제한사항

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

입출력 예

n / result

2 [ [1,2], [1,3], [2,3] ]

 

# 문제 풀이

 

재귀 알고리즘을 배울때 기본적으로 보는 팩토리얼, 피보나치, 하노이의 탑 중 하노이의 탑 문제이다.

재귀로 하노이의 탑 이동 절차를 모두 배열로 담아서 반환해주는 간단한 문제 특별한 점은 없다. 다만 하노이 탑 이동에 대한 이동이 머릿속에 바로 그려지지 않는다면 처음 짤때 조금 난감할 문제이다. 블럭이 하나 남을때 까지 1, 2, 3 블럭을 돌아가면서 한 블럭을 다른 탑으로 옮기고 그 블럭 아래의 블럭을 블럭을 옮긴 탑과 다른 탑으로 옮긴후 처음 옮긴 블럭을 처음 옮겼던 탑과 다른 탑으로 옮기는 과정을 반복하면 된다. 그후 하나 남은 블럭을 바로 3번째 탑으로 옮기면 된다. 이 이동 과정을 전부 배열로 담아서 반환해준다.

 

# 솔루션 플로우

1. 입력 받은 n이 1이 될때까지 재귀 함수(n, from, by, to)를 실행한다.

2. n이 1보다 크다면 from에서 by로 한블럭을 보낸다.

3. 다음 블럭을 from에서 to로 보낸후 배열에 [from, to]를 삽입한다.

4. by로 보냈던 블럭을 to로 보낸다.

5. n이 1과 같다면 [from, to]으로 바로 보낸후 재귀를 종료한다.

6. 얻어진 result를 반환한다.

1. 재귀 함수를 활용한 풀이

function solution(n) {
    const result = [];

    const hanoi = (n, from, by, to) => {
        if (n === 1) {
            result.push([from, to]);
        } else {
            hanoi(n - 1, from, to, by);
            result.push([from, to]);
            hanoi(n - 1, by, from, to);
        }
    }
    hanoi(n, 1, 2, 3);

    return result;
}
반응형