[#28][알고리즘] 하노이의 탑
프로그래머스 > 하노이의 탑
문제 링크(https://programmers.co.kr/learn/challenge_codes/157)C++풀이
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<vector<int> > answer;
void move(int no, int begin, int end){
if(no==1){
answer.push_back({begin, end});
}else{
int passPoint = 6 - begin - end;
move(no-1, begin, passPoint);
answer.push_back({begin, end});
move(no-1, passPoint, end);
}
}
vector<vector<int> > hanoi(int no)
{
move(no,1,3);
return answer;
}
int main()
{
int testNo = 2;
vector<vector<int> > testAnswer = hanoi(testNo);
// 아래는 테스트로 출력해 보기 위한 코드입니다.
for(int i=0; i< testAnswer.size(); i++)
{
for(int j=0; j<testAnswer[i].size(); j++)
{
cout << testAnswer[i][j] << " ";
}
cout << "\n";
}
}
| cs |
N개의 원판
if (원판이 1개 있을 때)
바로 막대 1 -> 막대 3으로 옮김
else
1. N-1개의 원판을 막대 2로 옮긴다.
2. 막대 1에 남아있는 가장 큰 원판을 막대 3으로 옮긴다.
3. STEP1에서 막대 2로 옮겨진 N-1개의 원판을 막대 3으로 옮긴다.
예) 2개의 원판이 있을 때
막대 1 -> 막대 2 (passPoint): 맨 위의 원판 옮김
막대 1 -> 막대 3 : 맨 아래의 원판 옮김
막대 2 (passPoint)-> 막대 3 : 막대 2로 옮겨진(처음에 맨 위에있던) 원판 옮김
답 => [[1,2], [1,3], [2,3]]
댓글
댓글 쓰기