🙇‍♀️순열구하기(DFS : Depth First Search)

자연수 N과 R이 주어지면 서로 다른 N개의 자연수 중 R개를 뽑아 일렬로 나열하는 프로그램을 작성하세요.

▣ 입력설명
첫 번째 줄에 자연수 N(1<=N<=15)과 R(0<=R<=15)이 주어진다. 
단 (N>=R)

두 번째 줄에 N개의 서로 다른 자연수가 오름차순으로 주어진다.

▣ 출력설명
순열의 각 경우를 아래와 같이 오름차순으로 출력한다. 마지막 줄에 총 개수도 출력한다.

▣ 입력예제 1 
4 3
1 3 6 7

▣ 출력예제 1
1 3 6
1 3 7
1 6 3
1 6 7
1 7 3
1 7 6
3 1 6
3 1 7
3 6 1
3 6 7
3 7 1
3 7 6
6 1 3
6 1 7
6 3 1
6 3 7
6 7 1
6 7 3
7 1 3
7 1 6
7 3 1
7 3 6
7 6 1
7 6 3
24

🚀풀이

DFS로 순열의 모든 경우를 구한다.

L은 단계를 나타낸다.

한번 포함한 숫자는 다시 쓰면 안되므로 체크 배열을 만든다.

다음 DFS에서 호출을하다가 다시 리턴할 때 체크를 풀어준다.

int n, r, cnt = 0;
int arr[20], ch[20], res[20];
void DFS(int L)
{
	if (L == r)
	{
		for (int i = 0; i < r; ++i)
		{
			cout << res[i] << " ";
		}
		cout << '\n';
		cnt++;
	}
	else
	{
		for (int i = 1; i <= n; ++i)
		{
			if (ch[i] == 0)
			{
				res[L] = arr[i];
				ch[i] = 1;
				DFS(L + 1);
				ch[i] = 0;
			}
		}
	}
}

🚀전체 코드

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int n, r, cnt = 0;
int arr[20], ch[20], res[20];

void DFS(int L)
{
	if (L == r)
	{
		for (int i = 0; i < r; ++i)
		{
			cout << res[i] << " ";
		}
		cout << '\n';
		cnt++;
	}
	else
	{
		for (int i = 1; i <= n; ++i)
		{
			if (ch[i] == 0)
			{
				res[L] = arr[i];
				ch[i] = 1;
				DFS(L + 1);
				ch[i] = 0;
			}
		}
	}
}

void solve()
{
	cin >> n >> r;
	for (int i = 1; i <= n; ++i)
		cin >> arr[i];

	DFS(0);

	cout << cnt;
}

int main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}