Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[2311] Re: 그 소스는 이것과는 상관이 없습니다.
김백일.cedar [cedar] 1210 읽음    2003-04-08 11:08
강재호.만해 님이 쓰신 글 :
: 안녕하세요 만해입니다.
:
: 흐흐 여기에다 글을 적는건 오랜만이네요
:
: 방금 동생이 숙제 못한다고 좀 해달라고 되게 징징 그려서
:
: 하나 해줬습니다.
:
: 여동생도 아닌것이 징징 그려 쩝~
:
: 각설 하고요
:
: 내용은
:
: 이런 것인데요
:
: 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;
}

+ -

관련 글 리스트
2305 [만해] 소스좀 봐주세요 강재호.만해 1185 2003/04/08
2311     Re: 그 소스는 이것과는 상관이 없습니다. 김백일.cedar 1210 2003/04/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.