
백준 15649 - N 과 M (1)
링크
https://www.acmicpc.net/problem/2606
문제 풀이
주어진 N 개에서 M 개를 뽑아 나열하는 순열 문제.
백트래킹 을 이용해 만들 수 있는 모든 수열의 경우의 수 를 만들어 준다. check 를 이용해 똑같은 숫자를 여러 번 뽑는 중복 행위를 판단하고 v 배열을 통해 한 수열이 만들어지면 출력하도록 한다.
- v : 뽑은 숫자를 저장하기 위한 배열
- check : 해당 숫자가 뽑혔는지 판단하기 위한 배열
전체 소스 코드
#include <iostream> #include <vector>
#define endl '\n' using namespace std;
vector<int> v; vector<bool> check;
void dfs(int n, int m, int depth) { if (m == depth) { for (int value : v) { cout << value << " "; } cout << endl; return; }
for (int i = 0; i < n; i++) { if (check[i] == true) { continue; }
check[i] = true; v[depth] = i + 1; dfs(n, m, depth + 1); check[i] = false; } }
int main(void) { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); int N, M; cin >> N >> M; v = vector<int>(M); check = vector<bool>(N);
dfs(N, M, 0); }
|