[JavaScript][Programmers] 하노이의 탑

조준형·2021년 8월 10일
0

Algorithm

목록 보기
62/142
post-thumbnail

🔎 하노이의 탑

❓ 문제링크

https://programmers.co.kr/learn/courses/30/lessons/67259

📄 제출 코드

function solution(n) {
    hanoi(n, 1, 3, 2);
    return arr;
}
let arr = [];
function hanoi(n, from, to, mid) {
    if (n == 1) { arr.push([from, to]); }
    else {
        hanoi(n - 1, from, mid, to);
        arr.push([from, to]);
        hanoi(n - 1, mid, to, from);
    }
}
let n = 2;
console.log(solution(n));

👉 하노이의 탑?

하노이의 탑(Tower of Hanoi)은 퍼즐의 일종이다. 세 개의 기둥과 이 기둥에 꽂을 수 있는 크기가 다양한 원판들이 있고, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있다.

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

  • 한 번에 한개의 원판만 옮길 수 있다.
  • 큰 원판이 작은 원판 위에 있어서는 안 된다.
  • 1번에는 n개의 원판이 있고 이 n개의 원판을 3번 원판으로 최소 횟수로 옮겨야 한다.
    일반적으로 원판이 n개 일 때, 2n -1번의 이동으로 원판을 모두 옮길 수 있다(2n − 1는 메르센 수라고 부른다).

👉 풀이

hanoi(n, 1, 3, 2);

1(from)에 있는 n개원판을 3(to)으로 보내고, 2(mid)에 중간 위치.

function hanoi(n, from, to, mid) {
  if (n == 1) { arr.push([from, to]); }
  else {
    hanoi(n - 1, from, mid, to);
    arr.push([from, to]);
    hanoi(n - 1, mid, to, from);
  }
}

n==1인경우는 가장 작은 원판을 옮길 때이다.
가장 작은 원판을 옮길 때 from, to를 arr에 저장한다.
2개이상의 원판을 옮길 때 가장 밑의 원판을 중간 위치(mid)로 보낸다.
가장 아래쪽 원판을 목표위치로 옮기고 ([from,to]),
중간 위치(mid)로 보낸 원판을 다시 목표위치로 옮겨서 전체이동을 마무리한다.

📘 참고

https://ko.wikipedia.org/wiki/하노이의_탑
https://blog.martinwork.co.kr/theory/2018/10/07/hanoi-algorithm.html
https://velog.io/@jeky22/javascript-프로그래머스-하노이의-탑

profile
깃허브 : github.com/JuneHyung

0개의 댓글