본문 바로가기
알고리즘/프로그래머스

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

by 오오오니 2023. 11. 11.

문제

a, b, c 막대가 있다
a에 있는 n개의 원반를 c로 옮기는 방법을 출력하는 문제이다.

풀이

재귀법으로 풀었다.

  1. a에 있는 n-1개의 원반을 b로 옮기고 -> hnoi(n-1,from,to,via);
  2. a에 있는 1개의 원반을 c로 옮기고 -> answer.push_back({from, to});
  3. b에 있는 n개의 원반을 c로 옮기면 된다 -> hnoi(n-1,via,from,to) ;

hnoi는 n개의 원반을 from막대에서 to막대로 옮기는 함수이다.

#include <string>
#include <vector>
#include<iostream>
using namespace std;

vector<vector<int>> answer;

void hnoi(int n ,int from , int via , int to){

   if(n==1)
   {

       answer.push_back({from , to});
       return;
   }
    hnoi(n-1,from,to,via);
    answer.push_back({from, to});
    hnoi(n-1,via,from,to) ;

}

vector<vector<int>> solution(int n) {
    hnoi(n,1,2,3);
   return answer;
}

고민했던 점

2차원 벡터에 1차원 벡터를 넣어야해서 함수를 호출할 때마다 새로운 1차원 벡터를 만들어서 넣어줬었다.
알아서 메모리 해제가 될 것 같지만 다른 방법이 있나 궁금했는데 다른사람의 풀이를 보니까

     vector<int>temp2;
     temp2.push_back(from);
     temp2.push_back(to);

벡터를 선언해서 넣는 대신에 {}를 사용해서 바로 answer.push_back({a,b}); 로 넣어줄 수 있다.