본문 바로가기

백준

C++ [백준]15657번 N과 M(8)

https://www.acmicpc.net/problem/15657

 

15657번: N과 M (8)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

 

솔루션


이 문제는 N과 M의 또 다른 변형으로 백트래킹에 이해를 돕기에 아주 좋은 문제인 것 같다.

 

나는 값을 입력을 받아서, 정렬을 하고

각각의 인덱스와 깊이를 인자로 넘겨주어서,

인덱스를 몇 번 골랐는지 체크 하고, 깊이가 만족이 된다면 출력을 하도록 코드를 짰다.

 

 

 

코드


#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;

vector<int> arr;
int N, M;
int print[9];

void printNM(int idx, int deep) {
	if (deep == M) {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < print[i]; j++) {
				cout << arr[i] << " ";
			}
		}
		cout << "\n";
	}
	else {
		for (int i = idx; i < N; i++) {
			print[i]++;
			printNM(i, deep+1);
			print[i]--;
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		int val;
		cin >> val;
		arr.push_back(val);
	}
	sort(arr.begin(), arr.end());

	printNM(0, 0);
}