|
강재호.만해 님이 쓰신 글 :
: 안녕하세요 만해입니다.
:
: 흐흐 여기에다 글을 적는건 오랜만이네요
:
: 방금 동생이 숙제 못한다고 좀 해달라고 되게 징징 그려서
:
: 하나 해줬습니다.
:
: 여동생도 아닌것이 징징 그려 쩝~
:
: 각설 하고요
:
: 내용은
:
: 이런 것인데요
:
: 01
: 10
:
: 012
: 021
: 120
: ...
:
: 0123
: 0132
: ...
:
: 이런식으로 0으로부터 시작해서 하나씩 증가하는 숫자 열 에서
:
: 01 이면 01을 제외한 01로 이루어 질수 있는 다른 배열을
:
: 012면 012를 제외한 012로 이루어 질수 있는 다른 배열을 쭉 출력 해라는 문제 였는데요
:
: 김백일님의 소스를 참고로 해서 만들었는데
:
: 이상하게 종료가 바로 안되네요
random_shuffle 알고리듬과는 전혀 상관 없습니다.
이건 고등학교 수학시간에 나오는 순열(permutation) 계산에 대한 겁니다.
출제자가 정확한 용어를 사용하지 않았기 때문에 혼동하신 듯하네요. ^^;
순열에 대한 알고리듬은 STL에 물론 들어있습니다.
next_permutation과 prev_permutation 알고리듬을 사용하면 됩니다.
예제는 다음과 같습니다.
//---------------------------------------------------------------------------
#include <iostream>
#pragma hdrstop
#include <algorithm>
#include <iterator>
//---------------------------------------------------------------------------
using namespace std;
int main()
{
char digits[] = "0123456789"; // 귀찮아서 그냥 char 배열을 썼습니다. ^^;
ostreambuf_iterator<char> out(cout); // 단순히 char만을 출력할 때는 ostreambuf_iterator를 쓰세요.
const int max_length = 5; // 이걸 10으로 하면 엄청 오래걸립니다. O(n!) 알고리듬이니까요.
// 결과가 필요하다면 파일로 redirection해서 보시길...
for (int i = 2; i <= max_length; ++i) {
do {
copy(&digits[0], &digits[i], out);
cout.put('\n');
} while (next_permutation(&digits[0], &digits[i]));
// next_permutation이 false를 반환하면 모든 순열이 다 출력된 겁니다.
cout.put('\n');
}
return 0;
}
|