algorism
[코드 리뷰] 순열 생성 알고리즘
Maison
2024. 11. 4. 23:51
# 처음 작성했던 코드
void permutation(vector<char>& array)
{
for(int i=0;array.size();i++)
{
if(array.size()<=1)
{
cout<<array[0]<<endl;
}
else
{
swap(array[0],array[i]);
cout<<array[0]<<" ";
vector<char> array_new;
for(int j=1;j<array.size();j++)
array_new.push_back(array[j]);
permutation(array_new);
swap(array[0],array[i]);
}
}
}
구현 개요
* 배열의 첫번째 원소를 고정한 후 나머지 배열에 대해 재귀적으로 순열을 생성하는 방식입니다.
* 종료 조건과 재귀 호출을 통해 남은 요소들로 모든 가능한 순열을 출력하는 구조로 작성되었습니다.
당시의 생각)
1) 동작 개념은 잡혀있었음.
- 배열의 첫 원소를 고정시키고 나머지 배열을 작업하는것.
2) 종료 조건 또한 생각하고 있었음.
- 반복시키는 배열의 수가 1보다 작을 때 종료조건.
문제점
1. 종료 조건의 위치 문제
* 재귀 함수 호출시 종료조건은 가장 먼저 확인되어야 합니다. 배열의 크기가 1 이하일때 바로 종료하지 않고 반복문을 수행하게 되어 무한루프에 빠지게 되었습니다.
2. 최종 출력 형식 문제
* 최종 출력 형식은 순열과 같이 1,2,3,4 / 1,2,4,3 으로 출력되도록 요청되었습니다.
이에 따라, 모든 원소의 배치가 완료된 이후에 출력되도록 구현해야 합니다.
# 최종 변경 코드
void permituation(vector<int>& array,int left)
{
if(left<=1)
{
print_all(array);
return;
}
for(int i= array.size()-left;i<array.size();i++)
{
swap(array[array.size()-left],array[i]);
permituation(array,left-1);
swap(array[array.size()-left],array[i]);
}
}