it 취업을 위한 알고리즘 문제풀이 입문 : 82. 순열구하기(DFS : Depth First Search)
🙇♀️순열구하기(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;
}