HANCO
백준 N과M(2) 본문
N과M(2) 문제는 자칫 1번 문제와 매우 유사해 보일 수 있다.
하지만 차이점은 기존 solve(idx, cnt+1)을 이용해 재귀를 돌린 것과 다르게 solve(i, cnt+1)을 이용해 재귀를 돌린다.
첫번째 코드에서는 idx는 한 분기가 끝나고 증가는 재귀문이기 때문에 1과의 조합을 전부 선택한후 2와의 조합들을 선택하지만
두번째 코드는 i의 값으로 인자를 받기때문에 (1, 2), (1, 3), (1, 4) 이후에 (2, 1)이 아니라 무조건 뒤 숫자가 앞 숫자보다 큰 (2, 3)이 나오게 된다.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int N, M;
int arr[8];
vector<int> v;
bool sel[8];
void solve(int idx, int cnt){
if(cnt == M){
for(int i=0;i<M;i++){
cout << v[i] << " ";
}
cout << '\n';
return;
}
for(int i=idx;i<N;i++){
if(sel[i] == true) continue;
sel[i] = true;
v.push_back(arr[i]);
solve(i, cnt+1);
v.pop_back();
sel[i] = false;
}
}
int main(){
cin >> N >> M;
for(int i=1;i<=N;i++){
arr[i-1] = i;
}
solve(0, 0);
}