# 생각

출력 결과를 보면 한번 선택한 수는 여러번 사용이 불가하므로 잘 걸러내주자

 

또한 고른 수열은 오름차순이어야 하기 때문에

시작지점을 잘 설정해 주어야 한다

int cnt = arr[k - 1] + 1;

 

 

# 전체 코드

// 1s, 512MB
// 1 <= M <= 8
#include <bits/stdc++.h>
using namespace std;

int arr[10];
bool bUsed[10];

void funcRecursive(int k, int n, int m)	// 현재 k까지 수를 선택했다
{
	if (k == m)	// m개를 모두 택했으면
	{
		for (int i = 0; i < m; i++)
		{
			cout << arr[i] << ' ';	// arr에 기록해둔 수를 출력
		}
		cout << '\n';
		return;
	}
	int cnt = arr[k - 1] + 1;
	//int cnt = 1;	// 시작지점, k = 0일 때는 1
	//if(cnt != 0) cnt = arr[k - 1] + 1;	// k != 0일 경우 arr[k-1] + 1
	for (int i = cnt; i <= n; i++)
	{
		if (bUsed[i] == false)	// 아직 i가 사용되지 않았으면
		{
			arr[k] = i;	// k번째 수를 i로 정한다
			bUsed[i] = true;	// i를 사용
			funcRecursive(k + 1, n, m);	// 다음 수를 정하러 한 단계 더
			bUsed[i] = false;	// k번째 수를 i로 정한 모든 경우에 대해 다 확인했으니 i를 미사용
		}
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int N, M;
	cin >> N >> M;
	funcRecursive(0, N, M);
}

 

 

# next_permutation을 이용한 코드

#include <bits/stdc++.h>
using namespace std;

void dfs2(int n, int m)
{
	vector<int> v;
	for (int i = 0; i < n; i++)
	{
		v.push_back(i < m ? 0 : 1);
	}
	do
	{
		for (int i = 0; i < n; i++)
		{
			if (v[i] == 0)
			{
				cout << i + 1 << ' ';
			}
		}
		cout << '\n';
	} while (next_permutation(v.begin(), v.end()));
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int N, M;
	cin >> N >> M;
	dfs2(N, M);
}

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

 

15650번: N과 M (2)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 15655_N과 M(6) with cpp  (0) 2022.02.07
[BOJ] 15652_N과 M (4) with cpp  (0) 2022.02.07
[BOJ] 15664_N과 M(10) with cpp  (0) 2022.02.07
[BOJ] 15663_N과 M (9) with cpp  (0) 2022.02.06
[BOJ] 15654_N과 M (5) with cpp  (0) 2022.02.06

+ Recent posts