https://www.acmicpc.net/problem/15649
int n,m;
int arr[10];
bool isused[10];
void func(int k){ // 현재 k개까지 수를 택했음.
if(k == m){ // m개를 모두 택했으면
for(int i = 0; i < m; i++)
cout << arr[i] << ' '; // arr에 기록해둔 수를 출력
cout << '\n';
return;
}
for(int i = 1; i <= n; i++){ // 1부터 n까지의 수에 대해
if(!isused[i]){ // 아직 i가 사용되지 않았으면
arr[k] = i; // k번째 수를 i로 정함
isused[i] = 1; // i를 사용되었다고 표시
func(k+1); // 다음 수를 정하러 한 단계 더 들어감
isused[i] = 0; // k번째 수를 i로 정한 모든 경우에 대해 다 확인했으니
//i를 이제 사용되지않았다고 명시함.
// arr[k]는 어짜피 다른 값으로 덮힐 예정이므로 따로 처리 안해줘도 된다
}
}
}
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
func(0);
}
https://www.acmicpc.net/problem/9663
https://www.acmicpc.net/problem/1182
헤더에 #include < algorithm > 선언을 통해 사용 가능
순열과 조합에서 매우 유용
현재의 수열을 사전 순으로 생각했을 때의 다음 수열로 만들고 true를 반환한다!!!
-> 현재 123 이라면 다음은 132가 된다
현재 수열이 사전순으로 생각했을 때 가장 마지막이라면 false를 반환
next_permutation 함수는 기본적으로 중복을 제거 하여 반환해준다!!
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
int a[3] = { 1,2,3 };
do {
for (int i = 0; i < 3; i++)
cout << a[i];
cout << "\n";
} while (next_permutation(a, a + 3));
}
/* 출력결과
123
132
213
231
312
321
*/
#include <string>
#include <vector>
#include <unordered_map>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<int> v;
for(int i = 1; i <= 3; i++) {
v.push_back(i);
}
do {
for(int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << "\n";
} while (next_permutation(v.begin(), v.end()));
// end의 경우 해당 리스트의 마지막 요소의 한칸 뒤 주소를 가리킨다
return 0;
}
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
int a[4] = { 0, 0, 1, 1 };
do {
for (int i = 0; i < 4; i++)
if (a[i] == 0)
cout << i + 1;
cout << "\n";
} while (next_permutation(a, a + 4));
}
/*출력
12
13
14
23
24
34
*/
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int N;
int M;
int visited[100] = {0};
void getResult(int toChoose, int num) {
if (toChoose == 0) // 기저조건 - M개 모두 골랐다
{
for(int i = 0; i < N; i++) {
if (visited[i]) cout << i+1 << " ";
}
cout << "\n";
return;
}
else
{
for(int i = num; i < N; i++) {
visited[i] = 1;
getResult(toChoose - 1, i + 1);
visited[i] = 0;
// 한 개 골랐으므로 toChoose - 1 넘긴다
// 방금 선택한 index 이후 부터 고려하기 위해 i+1 넘긴다
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
cin >> M; // N개 중에 M개를 고른다
getResult(M, 0);
return 0;
}
// 입력 : 6 3
// 출력 :
1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
3 4 5
3 4 6
3 5 6
4 5 6