문제
a, b, c 막대가 있다
a에 있는 n개의 원반를 c로 옮기는 방법을 출력하는 문제이다.
풀이
재귀법으로 풀었다.
- a에 있는 n-1개의 원반을 b로 옮기고 -> hnoi(n-1,from,to,via);
- a에 있는 1개의 원반을 c로 옮기고 -> answer.push_back({from, to});
- 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}); 로 넣어줄 수 있다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 코딩 테스트 공부 C++ (0) | 2023.11.24 |
---|---|
[프로그래머스] 숫자 문자열과 영단어 c++ (0) | 2023.11.23 |
[프로그래머스] 포켓몬 c++ (0) | 2023.11.07 |
[프로그래머스] 정수삼각형 c++ (0) | 2023.11.06 |
[프로그래머스] 타겟넘버 c++ (0) | 2023.09.28 |