일하는데 자꾸 포봄 생각에 마음이 걸려서
잠깐 코드를 짜봤음. 최대한 간단하게 짜는데에 초점을 맞춤.
vector<string> getPermutations(string str)
{
vector<string> t,v;
if( str.length() <= 1 ){
v.push_back(str);
return v;
}
for( int i = 0; i < str.length(); i++ ){
swap(str[0],str[i]);
t = getPermutations(str.substr(1));
swap(str[i],str[0]);
for( int j = 0; j < t.size(); j++ )
v.push_back(str[i] + t[j]);
}
return v;
}
int main()
{
for( auto s : getPermutations("ABCDEF") )
cout << s << endl;
return 0;
}
포봄의 재귀 방식이 대충 뭔지 알겠고 그거 따라서 만들었음.
뭐 복잡하게 짤 필요 없다니까. 재귀로 짜는 이유가 간단하게 하려고 그러는건데.
너님 코드는 좀 보기가 힘들정도로 복잡했음.
물론 퍼포먼스같은 건 신경쓰지마.
그야 당연한거지 설마 한 경우에 대해서 짰겠냐
물론 알고리즘이 너무 느린거같으면 좀 생각해서 개선할 부분 해보고 다시 올려줌. 어차피 지금 할일도 없고.
코드가 간단명료하니까 뭐 어떻게 동작하는지는 바로 눈에 들어올 거임
재귀는 간단하게 하라고 있는거지.
많이 짜다보면 recursion depth를 적극 활용하고 머릿속에 자동으로 트리가 그려지면서 익숙해질거임
kldp에 누가 적었듯이 stl의 next_permutation 쓰면 더욱 간단하게 짤 수 있으니 참고
http://cs.stackexchange.com/questions/11611/can-all-permutations-of-a-set-or-string-be-generated-in-on-log-n-time
임의 배열의 순열 집합 생성 알고리즘의 performance에 관심이 있다면 위를 참고
글 보면 알겠지만 사실 퍼포먼스를 논할 필요는 별로 없을듯