목차
코드
#include <iostream>
#include <vector>
using namespace std;
int n, m;
bool check[9] = {0, };
vector <int> v;
void solve(int num, int cnt){
if(cnt == m) {
for(int j=0; j<m; j++){
cout << v[j] << " ";
}
cout << "\n";
}
else{
for(int i=num; i<=n; i++){
if(check[i] == 1) continue;
check[i] = 1;
v.push_back(i);
solve(i+1, cnt + 1);
v.pop_back();
check[i] = 0;
}
}
}
int main() {
cin >> n >> m;
solve(1, 0);
return 0;
}
사견
어제 푼 N과 M(1) 의 다음문제이다.
1의 경우에서는 1 2 와 2 1 을 다른 순열로 판단했지만, 이번 문제는 이 둘을 같은 것으로 보고 앞에서 1 2 가 나오면 후에
2 1 은 나올 수가 없다.
즉, 생각해보면 저번 문제에서 조금만 바꾸면 이 문제의 해답이 된다는 뜻과 같다.
void solve(int num, int cnt){
if(cnt == m) {
for(int j=0; j<m; j++){
cout << v[j] << " ";
}
cout << "\n";
}
else{
for(int i=num; i<=n; i++){
if(check[i] == 1) continue;
check[i] = 1;
v.push_back(i);
solve(i+1, cnt + 1);
v.pop_back();
check[i] = 0;
}
}
}
1 문제에서 빼온 함수이다.
이번 코드와 다른점이 무엇일까?
바로 함수의 인자이다.
인자로 반복문의 시작점을 따로 정해주는 것이다.
이렇게 하면 이 문제를 풀 수 있다.
'공부 > 백준' 카테고리의 다른 글
1010번: 다리 놓기(백준 C++) (0) | 2020.11.08 |
---|---|
15651번: N과 M(3)(백준 C++) (0) | 2020.11.06 |
15649번: N과 M(1)(백준 C++) (0) | 2020.11.04 |
10814번: 나이순 정렬(백준 C++) (0) | 2020.11.03 |
1181번: 단어 정렬(백준 C++) (0) | 2020.11.02 |