https://www.acmicpc.net/problem/15649
N과 M (1)
#include <iostream>
using namespace std;
bool check[10];
int a[10];
void go(int index, int n, int m) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << a[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = 1; i <= n; i++) {
if (check[i]) continue;
check[i] = true;
a[index] = i;
go(index + 1, n, m);
check[i] = false;
}
}
int main() {
int n, m;
cin >> n >> m;
go(0, n, m);
return 0;
}
https://www.acmicpc.net/problem/15650
N과 M (2)
#include <iostream>
using namespace std;
int a[10];
void go(int index, int start, int n, int m) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << a[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = start; i <= n; i++) {
a[index] = i;
go(index + 1, i + 1, n, m);
}
}
int main() {
int n, m;
cin >> n >> m;
go(0, 1, n, m);
return 0;
}
https://www.acmicpc.net/problem/15651
N과 M (3)
같은 수를 여러번 골라도 된다.
#include <iostream>
using namespace std;
int a[10];
void go(int n, int m, int index) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << a[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = 1; i <= n; i++) {
a[index] = i;
go(n, m, index + 1);
}
}
int main() {
int n, m;
cin >> n >> m;
go(n, m, 0);
return 0;
}
함수 정의할 때, return 깜빡하지 마라 종료 조건
https://www.acmicpc.net/problem/15652
N과 M (4)
같은 수를 여러 번 골라도 되며, 비내림차순이어야 한다.
#include <iostream>
using namespace std;
int a[10];
void go(int n, int m, int index, int start) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << a[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = start; i <= n; i++) {
a[index] = i;
go(n, m, index + 1, i);
}
}
int main() {
int n, m;
cin >> n >> m;
go(n, m, 0, 1);
return 0;
}
https://www.acmicpc.net/problem/15654
N과 M (5)
N개의 자연수가 주어졌을 때, 길이가 M인 수열을 모두 구하라
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int check[10];
int d[10];
void go(int n, int m, int index) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << d[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = 0; i < n; i++) {
if (check[i]) continue;
check[i] = true;
d[index] = a[i];
go(n, m, index + 1);
check[i] = false;
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
go(n, m, 0);
return 0;
}
https://www.acmicpc.net/problem/15655
N과 M (6)
오름차순 수열
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int check[10];
int d[10];
void go(int n, int m, int index, int start) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << d[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = start; i < n; i++) {
if (check[i]) continue;
check[i] = true;
d[index] = a[i];
go(n, m, index + 1, i + 1);
check[i] = false;
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
go(n, m, 0, 0);
return 0;
}
https://www.acmicpc.net/problem/15656
N과 M (7)
같은 수를 여러 번 골라도 된다.
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int d[10];
void go(int n, int m, int index) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << d[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = 0; i < n; i++) {
d[index] = a[i];
go(n, m, index + 1);
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
go(n, m, 0);
return 0;
}
https://www.acmicpc.net/problem/15657
N과 M (8)
(7) + 비내림차순
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int d[10];
void go(int n, int m, int index, int start) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << d[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = start; i < n; i++) {
d[index] = a[i];
go(n, m, index + 1, i);
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
go(n, m, 0, 0);
return 0;
}
https://www.acmicpc.net/problem/15663
N과 M (9)
중복된 수 들이 주어진다.
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int cnt[10];
int d[10];
void go(int n, int m, int index) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << d[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = 0; i < n; i++) {
if (cnt[i] > 0) {
cnt[i] -= 1;
d[index] = a[i];
go(n, m, index + 1);
cnt[i] += 1;
}
}
}
int main() {
int n, m;
cin >> n >> m;
int temp[10];
for (int i = 0; i < n; i++) {
cin >> temp[i];
}
sort(temp, temp + n);
int k = 0;
int x = temp[0];
int c = 1;
for (int i = 1; i < n; i++) {
if (x == temp[i])
c += 1;
else {
a[k] = x;
cnt[k] = c;
k += 1;
x = temp[i];
c = 1;
}
}
a[k] = x;
cnt[k] = c;
n = k + 1;
go(n, m, 0);
return 0;
}
erase 함수를 사용하는 경우
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int a[10];
int num[10];
int c[10];
vector<vector<int>> d;
void go(int index, int n, int m) {
if (index == m) {
vector<int> temp;
for (int i=0; i<m; i++) {
temp.push_back(num[a[i]]);
}
d.push_back(temp);
return;
}
for (int i=0; i<n; i++) {
if (c[i]) continue;
c[i] = true;
a[index] = i;
go(index+1, n, m);
c[i] = false;
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i=0; i<n; i++) {
cin >> num[i];
}
sort(num,num+n);
go(0,n,m);
sort(d.begin(), d.end());
d.erase(unique(d.begin(),d.end()),d.end());
for (auto &v : d) {
for (int i=0; i<m; i++) {
cout << v[i];
if (i != m-1) {
cout << ' ';
}
}
cout << '\n';
}
return 0;
}
https://www.acmicpc.net/problem/15664
N과 M (10)
(9) + 비내림차순
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int cnt[10];
int d[10];
void go(int n, int m, int index, int start) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << d[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = start; i < n; i++) {
if (cnt[i] > 0) {
cnt[i] -= 1;
d[index] = a[i];
go(n, m, index + 1, i);
cnt[i] += 1;
}
}
}
int main() {
int n, m;
cin >> n >> m;
int temp[10];
for (int i = 0; i < n; i++) {
cin >> temp[i];
}
sort(temp, temp + n);
int k = 0;
int x = temp[0];
int c = 1;
for (int i = 1; i < n; i++) {
if (x == temp[i])
c += 1;
else {
a[k] = x;
cnt[k] = c;
k += 1;
x = temp[i];
c = 1;
}
}
a[k] = x;
cnt[k] = c;
n = k + 1;
go(n, m, 0, 0);
return 0;
}
https://www.acmicpc.net/problem/15665
N과 M (11)
같은 수를 여러번 골라도 된다.
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int cnt[10];
int d[10];
void go(int n, int m, int index) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << d[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = 0; i < n; i++) {
if (cnt[i] > 0) {
d[index] = a[i];
go(n, m, index + 1);
}
}
}
int main() {
int n, m;
cin >> n >> m;
int temp[10];
for (int i = 0; i < n; i++) {
cin >> temp[i];
}
sort(temp, temp + n);
int k = 0;
int x = temp[0];
int c = 1;
for (int i = 1; i < n; i++) {
if (x == temp[i])
c += 1;
else {
a[k] = x;
cnt[k] = c;
k += 1;
x = temp[i];
c = 1;
}
}
a[k] = x;
cnt[k] = c;
n = k + 1;
go(n, m, 0);
return 0;
}
https://www.acmicpc.net/problem/15666
N과 M (12)
(11) + 고른 수열은 비내림차순이어야 한다.
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int cnt[10];
int d[10];
void go(int n, int m, int index, int start) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << d[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = start; i < n; i++) {
if (cnt[i] > 0) {
d[index] = a[i];
go(n, m, index + 1, i);
}
}
}
int main() {
int n, m;
cin >> n >> m;
int temp[10];
for (int i = 0; i < n; i++) {
cin >> temp[i];
}
sort(temp, temp + n);
int k = 0;
int x = temp[0];
int c = 1;
for (int i = 1; i < n; i++) {
if (x == temp[i])
c += 1;
else {
a[k] = x;
cnt[k] = c;
k += 1;
x = temp[i];
c = 1;
}
}
a[k] = x;
cnt[k] = c;
n = k + 1;
go(n, m, 0, 0);
return 0;
}