댓글에 답글을 달려하니 동일한글자를 반복적으로 쓸 수 없다고 해서
새로 글을 썼습니다.
예전에 비슷한 걸 만든 기억이 있어 코드를 찾아봤네요.
다시 보니 뭔소린지... 가물가물하네요. ;
아무튼, 아래 코드와 같이 돌려 원하는 값을 얻었습니다.
뭔가 지저분해 보이는 느낌도 들고... ㅜ.ㅠ
#include <cstdio>
#include <cstring>
#include <string>
#include <list>
#include <set>
#include <algorithm>
using namespace std ;
int reverseList(list<int>* listInt, list<int>::iterator listIntIter)
{
set<int> setInt ;
set<int>::iterator setIntIter ;
while(listIntIter != listInt->end())
{
setInt.insert(*listIntIter) ;
listIntIter = listInt->erase(listIntIter) ;
}
if(setInt.empty())
return 0 ;
setIntIter = setInt.end() ;
while(1)
{
setIntIter-- ;
listInt->push_back(*setIntIter) ;
if(setIntIter == setInt.begin())
break ;
}
return 1 ;
}
int next_k_combination(list<int>* listInt, int k)
{
list<int>::iterator listIntIter ;
list<int>::iterator listEndIter ;
list<int>::iterator listNextIter ;
int flagIsSorted = 0 ;
while(1)
{
listIntIter = listInt->begin() ;
for(int ii = 0; ii < k; ii++)
listIntIter++ ;
reverseList(listInt, listIntIter) ;
if(!next_permutation(listInt->begin(), listInt->end()))
return 0 ;
// check isSorted?
flagIsSorted = 1 ;
listIntIter = listInt->begin() ;
for(int ii = 0; ii < k - 1; ii++)
{
listNextIter = (++listIntIter)-- ;
if(*listIntIter > *listNextIter)
{
flagIsSorted = 0 ;
break ;
}
listIntIter++ ;
}
if(flagIsSorted)
return 1 ;
}
return 0 ;
}
int main()
{
list<int> listTest ;
list<int>::iterator listTestIter ;
listTest.push_back(0) ;
listTest.push_back(1) ;
listTest.push_back(2) ;
listTest.push_back(3) ;
listTest.push_back(4) ;
int val[5] = {1, 3, 2, 2, 4} ;
int ret ;
while(1)
{
listTestIter = listTest.begin() ;
for(int ii = 0; ii < 3; ii++)
{
printf("%d ", val[*listTestIter++]) ;
}
printf("\n") ;
ret = next_k_combination(&listTest, 3) ;
if(!ret)
break ;
}
return 1 ;
}
그럼, 즐프하세요~ ^^