본문 바로가기

Archived(CSE Programming)/알고리즘(C++)

브루트포스-N과 M

1. N과 M

문제 참고 : https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

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

www.acmicpc.net

풀이

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

void make_nm(int, int, int);
vector<int> a;
vector<bool> c;

int main() {
	int m, n;
	cin >> n >> m; //입력받기
	
	a.assign(10, 0); // 할당
	c.assign(10, false); // 할당

	make_nm(n, m,0);
}


void make_nm(int n, int m, int idx) {
	// 성공조건
	if (idx == m) {
		// 출력
		for (int i = 0; i < m; i++) {
			cout << a[i]<<" ";
		}
		cout << "\n"; // 줄바꿈
		return;
	}
	for (int i = 1; i <= n; i++) {
		// true면 중복
		if (c[i])
			continue;
		a[idx] = i;
		c[i] = true; // 포함체크
		make_nm(n, m, idx + 1);
		c[i] = false; //  빼기체크
	}
}

2. N과 M(2) 오름차순

문제 참고 : https://www.acmicpc.net/problem/15650

 

15650번: N과 M (2)

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

www.acmicpc.net

풀이

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

void make_nm(int, int, int, int);
vector<int> a;
vector<bool> c;

int main() {
	int m, n;
	cin >> n >> m; //입력받기

	a.assign(10, 0); // 할당
	c.assign(10, false); // 할당

	make_nm(n, m, 0, 1);
}


void make_nm(int n, int m, int idx, int prev) {
	// 성공조건
	if (idx == m) {
		// 출력
		for (int i = 0; i < m; i++) {
			cout << a[i] << " ";
		}
		cout << "\n"; // 줄바꿈
		return;
	}
	for (int i = prev; i <= n; i++) {
		// true면 중복
		if (c[i])
			continue;
		a[idx] = i;
		c[i] = true; // 포함체크
		make_nm(n, m, idx + 1, i);
		c[i] = false; //  빼기체크
	}
}

3. N과 M(3) 중복가능

문제 참고 : https://www.acmicpc.net/problem/15651

 

15651번: N과 M (3)

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

www.acmicpc.net

풀이

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

void make_nm(int, int, int, int);
vector<int> a;
vector<bool> c;

int main() {
	int m, n;
	cin >> n >> m; //입력받기

	a.assign(10, 0); // 할당
	c.assign(10, false); // 할당

	make_nm(n, m, 0, 1);
}


void make_nm(int n, int m, int idx, int prev) {
	// 성공조건
	if (idx == m) {
		// 출력
		for (int i = 0; i < m; i++) {
			cout << a[i] << " ";
		}
		cout << "\n"; // 줄바꿈
		return;
	}
	for (int i = 1; i <= n; i++) {
		// true면 중복
//		if (c[i])
	//		continue;
		a[idx] = i;
		c[i] = true; // 포함체크
		make_nm(n, m, idx + 1, i);
		c[i] = false; //  빼기체크
	}
}

4. N과 M(4) 중복가능 비내림차순

문제 참고 : https://www.acmicpc.net/problem/15652 

 

15652번: N과 M (4)

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

www.acmicpc.net

풀이

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

void make_nm(int, int, int, int);
vector<int> a;
vector<bool> c;

int main() {
	int m, n;
	cin >> n >> m; //입력받기

	a.assign(10, 0); // 할당
	c.assign(10, false); // 할당

	make_nm(n, m, 0, 1);
}


void make_nm(int n, int m, int idx, int prev) {
	// 성공조건
	if (idx == m) {
		// 출력
		for (int i = 0; i < m; i++) {
			cout << a[i] << " ";
		}
		cout << "\n"; // 줄바꿈
		return;
	}
	for (int i = prev; i <= n; i++) {
		// true면 중복
//		if (c[i])
	//		continue;
		a[idx] = i;
		c[i] = true; // 포함체크
		make_nm(n, m, idx + 1, i);
		c[i] = false; //  빼기체크
	}
}

 

'Archived(CSE Programming) > 알고리즘(C++)' 카테고리의 다른 글

그래프의 탐색(DFS, BFS)  (0) 2019.08.15
그래프(Graph)  (0) 2019.08.14
비트마스크(BitMask)  (0) 2019.08.12
재귀함수(Recursive Function)  (0) 2019.08.12
순열(Permutation) 구하기  (0) 2019.08.07