문제
"맞았습니다" 코드
#include <bits/stdc++.h>
using namespace std;
int k, n;
vector<int> v;
void permu(){
vector<int> tempv(k, 1); // k만큼 1 으로 초기화.
for(int i = 0; i < 6; i++){ // 선택할 6개만 0으로 초기화
tempv[i] = 0;
}
do{
for(int i = 0; i < tempv.size(); i++){
if(tempv[i]==0){ // 선택한 6개만 출력
cout << v[i] << ' ';
}
}
cout << '\n';
}while(next_permutation(tempv.begin(), tempv.end()));
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
while(1){
cin >> k;
if(k == 0) break;
v.clear();
for(int i = 0; i < k; i++){
cin >> n;
v.push_back(n);
}
permu();
cout << '\n';
}
return 0;
}
리뷰
STL next_permutation() 으로 풀었다.
k개 중에서 6개만 선택한 조합을 출력하는 문제다.
next_permutation()은 사전순으로 마지막인 숫자면 false를 반환해서 멈춘다.
전체 길이 k가 8이면 반드시 6개만 선택해야 하니깐 0은 6개인 배열을 만든다.
그래서 벡터 tempv를 { 0,0,0,0,0,0,1,1 } 로 시작해야 한다.
0은 선택이고, 1은 선택안하는 것이다.
6개만 0으로 놓고 하면 되겠지 하고 짰는데
{1,1,0,0,0,0,0,0} 이렇게 시작해서 next_permutation()이 아예 동작을 안했었다.
마지막 조합 결과로 시작했기 때문이다.
이거 조심하기!!
728x90
'알고리즘 > 백준' 카테고리의 다른 글
계란으로 계란치기 백준 16987번 c++ (0) | 2021.12.11 |
---|---|
암호 만들기 백준 1759 c++ (0) | 2021.12.11 |
N과M(9) 백준 15663번 c++ (0) | 2021.12.10 |
하노이탑 이동 순서 백준 11729 c++ (0) | 2021.12.09 |
곱셈 백준 1629번 c++ (0) | 2021.12.08 |