BOJ 15654 : N과M (5) - C++
N과M (5)

코드
[ 백트래킹 코드 ]
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int N, M, input;
int arr[10];
bool isused[10];
vector<int> save(10);
void func(int depth){
    if(depth == M){
        for(int i=0;i<M;i++)
            cout << arr[i] << ' ';
        cout << '\n';
    }else{
        for(int i=0;i<N;i++)
        {
            if(isused[i]) continue;
            isused[i] = true;
            arr[depth] = save[i];
            func(depth+1);
            isused[i] = false;
        }
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M;
    for(int i=0;i<N;i++)
        cin >> save[i];
    sort(save.begin(), save.begin()+N);
    func(0);
    return 0;
}
- 수가 정해져 있기 때문에 save변수를 쓰는데, 사전순 증가로 출력해야 하기 때문에 정렬하려고vector<int> save로 선언
[ next_permutation 코드 ]
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int N, M;
int arr[10];
vector<int> save(10);
vector<vector<int>> ans;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M;
    for(int i=0;i<N;i++)
        cin >> save[i];
    sort(save.begin(), save.begin()+N);
    fill(arr, arr+N, 1);
    for(int i=0;i<M;i++) arr[i] = 0;    
    do{
        /* 1) 조합으로 뽑은 숫자를 tmp에 저장
           2) tmp에 대해 next_permutation() 수행 */
        vector<int> tmp;
        for(int i=0;i<N;i++)
            if(!arr[i]) tmp.push_back(save[i]);
        do{
            ans.push_back(tmp);
        }while(next_permutation(tmp.begin(), tmp.end()));
    }while(next_permutation(arr, arr+N));
    /* 제일 앞 요소가 작은 순서대로 오름차순 정렬 */
    sort(ans.begin(), ans.end());
    /* 2중 for문으로 출력 */
    for(auto a : ans)
    {
        for(auto b : a)
            cout << b << ' ';
        cout << '\n';
    }
    return 0;
}
- next_permutation()을 2중으로 써야함
 1) 전체 N개에서 M개를 뽑은 숫자들 구하는- do~while
 2) 뽑은 M개 숫자에 대해 다시 경우의 수를 구하는- do~while
- vector<vector<int>> ans에 대해 오름차순 정렬하면
 요소별로 비교해서 정렬됨!
   
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Author And Source
                            
                            이 문제에 관하여(BOJ 15654 : N과M (5) - C++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://velog.io/@neity16/BOJ-15650-N과M-5-C
                            
                            
                            
                                저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            

[ 백트래킹 코드 ]
#include <iostream> #include <algorithm> #include <vector> using namespace std; int N, M, input; int arr[10]; bool isused[10]; vector<int> save(10); void func(int depth){ if(depth == M){ for(int i=0;i<M;i++) cout << arr[i] << ' '; cout << '\n'; }else{ for(int i=0;i<N;i++) { if(isused[i]) continue; isused[i] = true; arr[depth] = save[i]; func(depth+1); isused[i] = false; } } } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N >> M; for(int i=0;i<N;i++) cin >> save[i]; sort(save.begin(), save.begin()+N); func(0); return 0; }
- 수가 정해져 있기 때문에
save변수를 쓰는데, 사전순 증가로 출력해야 하기 때문에 정렬하려고vector<int> save로 선언
[ next_permutation 코드 ]
#include <iostream> #include <algorithm> #include <vector> using namespace std; int N, M; int arr[10]; vector<int> save(10); vector<vector<int>> ans; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N >> M; for(int i=0;i<N;i++) cin >> save[i]; sort(save.begin(), save.begin()+N); fill(arr, arr+N, 1); for(int i=0;i<M;i++) arr[i] = 0; do{ /* 1) 조합으로 뽑은 숫자를 tmp에 저장 2) tmp에 대해 next_permutation() 수행 */ vector<int> tmp; for(int i=0;i<N;i++) if(!arr[i]) tmp.push_back(save[i]); do{ ans.push_back(tmp); }while(next_permutation(tmp.begin(), tmp.end())); }while(next_permutation(arr, arr+N)); /* 제일 앞 요소가 작은 순서대로 오름차순 정렬 */ sort(ans.begin(), ans.end()); /* 2중 for문으로 출력 */ for(auto a : ans) { for(auto b : a) cout << b << ' '; cout << '\n'; } return 0; }
next_permutation()을 2중으로 써야함
1) 전체 N개에서 M개를 뽑은 숫자들 구하는do~while
2) 뽑은 M개 숫자에 대해 다시 경우의 수를 구하는do~while
vector<vector<int>> ans에 대해 오름차순 정렬하면
요소별로 비교해서 정렬됨!
Author And Source
이 문제에 관하여(BOJ 15654 : N과M (5) - C++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@neity16/BOJ-15650-N과M-5-C저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)