백준/실버
[백준 15656번] N과 M (7) (C++)
게임개발기원
2023. 3. 19. 16:33
문제링크 : https://www.acmicpc.net/problem/15656
15656번: N과 M (7)
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
int N, M;
int arr[7];
int visited[7];
void Backtracking(int n)
{
if(n == M)
{
for(int i = 0; i<M; i++)
{
cout << arr[visited[i]] << " ";
}
cout <<'\n';
return;
}
for(int i=0; i<N; i++)
{
visited[n] = i;
Backtracking(n+1);
}
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for(int i=0; i<N; i++)
{
cin >> arr[i];
}
sort(arr, arr+N);
Backtracking(0);
return 0;
}
백트래킹 문제이다.
i = 0 일 때
visited[0]= 0, visited[1]=0, visited[2]=0, visited[3]=0
-> arr[0], a[0] 출력
맨처음 백트래킹을 호출했을 때로 돌아감 -> visited[1] = 1로 바뀜
visited[1]=1, visited[2]=1, visited[3] =1
-> arr[0], arr[1] 출력
맨처음 백트래킹을 호출했을 때로 돌아감 -> visited[1] = 2로 바뀜
visited[1]=2, visited[2]=2, visited[3] =2
-> arr[0], arr[2] 출력
맨처음 백트래킹을 호출했을 때로 돌아감 -> visited[1] = 3로 바뀜
visited[1]=3, visited[2]=3, visited[3] =3
-> arr[0], arr[3] 출력
위의 과정 반복