프로그래머스 하노이의 탑

걍걍규·2023년 7월 10일
1
post-thumbnail


재귀함수를 이용하는 대표적인 문제 하노이의 탑이다

  • 주어지는 원반은 위로 갈수록 작아지고 작은 원반의 위에는 더 큰 원반을 얹을 수 없다
  • 모든 원반을 3번 위치로 옮기는 것이 목적이다
  • 한번에 하나의 원반만 이동이 가능하다

function solution(n) {
    let answer = []

    const hanoi = (n, from, mid, to) => {
        if(n == 0){
          
        /*
          재귀 함수에는 종료 조건을 반드시 명시해 주어야 한다
          이 문제의 경우 n은 원판의 개수를 의미하고
          함수가 실행되면서 n은 1씩 줄어든다
          남은 원판이 0이 된다면 함수를 종료해준다
        */
          
            return
        }else{
          /*
          	원판이 남아 있는 경우에 실행할 함수
            자기 자신을 호출하여 함수 컨텍스트에 쌓이기 시작한다
            기존의 from, mid, to : 1, 2, 3
          */
            hanoi(n - 1 , from, to, mid);   
          //from, to, mid : 1, 3, 2
            answer.push([from, to]);
          //[1, 2] >> [1, 3] >> [2, 3] 순으로 푸쉬
            hanoi(n - 1, mid, from, to);
          //from, to, mid : 2, 1, 3
        }
    }

    hanoi(n, 1, 2, 3)
            
    return answer
  //answer : [[1, 2], [1, 3], [2, 3]]
  
  //만약 원반이 세개라면
  //[[ 1, 3 ], [ 1, 2 ],[ 3, 2 ], [ 1, 3 ],[ 2, 1 ], [ 2, 3 ],[ 1, 3 ]]
}

가장 큰 원반을 옮기기 위해서는 작은 원반을 모두 다른곳에 옮겨주고 다시 쌓고 과정을 반복해야 하는데
몇개의 원반이 들어오든 이 과정은 동일하다..
이해해보려고 노력하고 디버깅도 많이 해봤지만 아직도 확실히 모르겠다
하노이의 탑의 과정 자체는 이해했지만 from, to, mid의 위치가 바뀌면서 n이 1씩 줄어들고
그러는 와중에도 또 함수가 호출되고 n이 0이 될때까지 반복하며 answer에 원반을 옮기는 과정을 push해주는데 결론은 이게 재귀이거니 해야할까?

profile
안녕하시오?

0개의 댓글